本文根据jsliang Node - 从0基础到实战企业官网 练习所写,文章太好了实力推荐!!
1.http
01_http.js
//1.引入http模块
let http = require("http");
// 2.http创建服务
/**
* req 获取 url 信息 (request)
* res 浏览器返回响应信息 (response)
*/
http.createServer((req,res) =>{
// 设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8
res.writeHeade(200,{
"Content-Type": "text/html;charset=UTF-8"
});
//往页面打印值
res.write('<h3>hello NodeJS</h3>');
//结束响应
res.end();
}).listen(7777);//监听端口7777
执行上面代码: 终端输入node 01_http.js
在浏览器输入localhost:7777
2.URL模块
02_url.js
// 引入http模块
let http = require('http');
// 引入URL模块
let url = require('url');
/**
http创建服务
* req 获取 url 信息 (request)
* res 浏览器返回响应信息 (response)
*/
http.createServer((req,res)=>{
// 访问地址是:http://localhost:7777/?userName=wang&userAge=23
// console.log(req.url)会执行两次
// /?userName=wang&userAge=23
// /favicon.ico
// 这里为了防止重复执行,所以排除 req.url == /favicon.ico 的情况
if(req.url != '/favicon.ico'){
//使用 url 的 parse 方法
/**
* parse 方法需要两个参数:
* 第一个参数是地址
* 第二个参数是 true 的话表示把 get 传值转换成对象
*/
var result = url.parse(req.url,true);
console.log(result);
/**
* Url {
* protocol: null,
* slashes: null,
* auth: null,
* host: null,
* port: null,
* hostname: null,
* hash: null,
* search: '?userName=wang&userAge=23',
* query: { userName: 'wang', userAge: '23' },
* pathname: '/',
* path: '/?userName=wang&userAge=23',
* href: '/?userName=wang&userAge=23' }
*/
// console.log(result.query.userName);//wang
}
// 设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8
res.writeHead(200, {
"Content-Type": "text/html;charset=UTF-8"
});
// 往页面打印值
res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
// 结束响应
res.end();
}).listen(7777);
3. fs文件管理
03_fs.js
1. fs.stat 检查一个读取的是文件还是目录
// 引入fs文件模块
let fs = require("fs");
fs.stat('./01_http.js',(error, stats) => {
if(error){
console.log(error);
return;
}else{
console.log(stats);
// {
// dev: 16777221,
// mode: 33188,
// nlink: 1,
// uid: 501,
// gid: 20,
// rdev: 0,
// blksize: 4096,
// ino: 11158405,
// size: 487,
// blocks: 8,
// atimeMs: 1574065372034.9368,
// mtimeMs: 1574065370870.2712,
// ctimeMs: 1574065370870.2712,
// birthtimeMs: 1574060335297.9758,
// atime: 2019-11-18T08:22:52.035Z,
// mtime: 2019-11-18T08:22:50.870Z,
// ctime: 2019-11-18T08:22:50.870Z,
// birthtime: 2019-11-18T06:58:55.298Z }
console.log(`文件:${stats.isFile()}`);
// Console:文件:true
console.log(`目录:${stats.isDirectory()}`);
// Console:目录:false
return;
}
})
2. fs.mkdir 创建目录
fs.mkdir('css',(error)=>{
if(error){
console.log(error);
return;
}else{
console.log('创建css目录成功');
}
});
3.rmdir 删除文件
fs.rmdir('css',(error)=>{
if(error){
console.log(error);
return;
}else{
console.log('删除css目录成功');
}
})
4.writeFile 写入 : 存在即覆盖,不存在即创建
fs.writeFile('index.js','wang',(error)=>{
if(error){
console.log(error);
return;
}else{
console.log('写入indexJS成功');
}
})
5.appendFile 追加内容
fs.appendFile('index.js','追加内容试试',(error)=>{
if(error){
console.log(error);
return;
}else{
console.log('追加indexJS成功');
}
})
6.readFile/readdir 读取文件和读取目录
fs.readFile('index.js',(err,data) =>{
if(err){
console.log(err);
return false;
}else{
console.log('读取文件成功');
console.log(data);
}
})
fs.readdir('node_modules', (err, data) => {
if(err) {
console.log(err);
return false;
} else {
console.log("读取目录成功!");
console.log(data);
// Console:
// 读取目录成功!
// [ '03_tool-multiply.js', 'wang-module' ]
}
})
7.rename 重命名
fs.rename('index.js','wang.js',(error)=>{
if(error){
console.log(error);
return false;
}else{
console.log('index.js重命名为wang.js成功');
}
});
//rename 也有剪切的功能
//将wang.js 剪切至node_modules目录下
fs.rename('wang.js','node_modules/wang.js',(error) =>{
if(err) {
console.log(err);
return false;
} else {
console.log("剪切成功!");
}
})
4. fs流
1. 读取流
const fs = require('fs');
// 流的方式读取文件
let fileReadStream = fs.createReadStream('wang.js');
//保存数据
let str = '';
// 开始读取
fileReadStream.on('data',(chunk)=>{
console.log(chunk);
str += chunk;
});
//读取完成
fileReadStream.on('end',()=>{
console.log("——结束——");
console.log(str);//wang追加内容试试(wang.js内容)
});
// 读取失败
fileReadStream.on('error', (error) => {
console.log(error);
})
2. 写入流
const fs = require('fs');
let data = 'console.log("Hello World! 我要存入数据!")';
// 创建一个写入流 写入到wang.js中;
let writeStream = fs.createWriteStream('wang.js');
//开始写入
writeStream.write(data,'utf8');
//写入完成
writeStream.end();
writeStream.on('finish',()=>{
console.log('写入完成');
});
// wang.js 内容变成了: console.log("Hello World! 我要存入数据!")
5. MySQl
安装Node连接MySQL的包
npm i mysql -D
index.js
let mysql = require("mysql");
//mysql 连接信息
let connection = mysql.mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',//mysql数据库的密码
database: 'demoSql'//当前连接的数据库
});
// 开始连接
connection.connect();
//查询user表的数据
connection.query('SELECT * FROM user',(error, results)=>{
if(error) throw error;
console.log(results);
/* [ RowDataPacket { id: 1, name: 'wang', age: 24 },
RowDataPacket { id: 2, name: 'lu', age: 29 } ] */
});
//终止连接
connection.end();
6. 实际建立前后台通讯
index.js
//连接mysql :先安装 npm i mysql -D
let mysql = require('mysql');
//mysql连接信息
let connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'demoSql'
});
//开始连接
connection.connect();
// 引入http模块:http是提供web服务的基础
const http = require('http');
// 引入 url 模块:url 是对用户提交的路径进行解析
const url = require('url');
// 引入 qs 模块:qs 是对路径进行 json 化或者将 json 转换为 string 路径
const qs = require("querystring");
// 用 http 模块创建服务
/**
* req 获取 url 信息 (request)
* res 浏览器返回响应信息 (response)
*/
http.createServer((req,res) => {
//设置cors跨域
res.setHeader('Access-Control-Allow-Origin','*');
//设置header类型
res.setHeader("Access-Control-Allow-Headers",'Content-Type');
//跨域允许的请求方式
res.setHeader("Content-Type",'application/json');
switch(req.method){
case 'OPTIONS':
res.statusCode = 200;
res.end();
break;
case 'POST':
console.log('post方式');
//获取前端发来的路由地址;
let pathName = req.url;
// 接收发送过来的参数
let tempResult = "";
req.on('data',(data) =>{
tempResult+=data;//tempResult = username=admin&password=admin
});
req.on('end',() =>{
let result = JSON.stringify(qs.parse(tempResult));//{"username":"admin","password":"admin"}
if (pathName == "/sendMessage") { // 提交留言信息
console.log("\n【API - 提交留言信息】");
} else if (pathName == "/login") { // 登录
console.log("\n【API - 登录】");
} else if (pathName == "/register") { // 注册
console.log("\n【API - 注册】");
result = JSON.parse(result);
let username = result.username; // 用户名
let password = result.password; // 密码
let time = getNowFormatDate(); // 时间
if (!username) { // 用户名为空
res.end("注册失败,用户名为空。");
return;
} else if (!password) { // 密码为空
res.end("注册失败,密码为空!");
return;
} else{
console.log('sql')
//查询user表,是否存在已注册过的数据
//使用Promise的原因:是调用了两次数据库,数据库的查询是异步的,需要在查询无重复数据完成后往数据库添加此条数据;
new Promise((resolve,reject) =>{
let searchSql = 'SELECT * FROM user';
connection.query(searchSql,(err,reponse)=>{
if(err){//mysql错误
throw error;
}else{
console.log("\nSQL 查询结果:");
// console.log(reponse);
// [RowDataPacket{id:0,name:'',user_name:''..},RowDataPacket{id:0,name:'',user_name:''..}]
// 将结果先去掉 RowDataPacket,再转换为 json 对象
let newRes = JSON.parse(JSON.stringify(reponse));
// console.log(newRes);//[{id:0,..},{id:1...}]
let flag = false;//判断是否存在重复名称;
for(let item in newRes){
if(newRes[item].user_name == username){
flag = true;
}
}
//如果username重复
if(flag){
res.write(JSON.stringify({
code: "500",
message: "注册失败,姓名重复!"
}));
res.end();
return;
}else{
resolve();//可以注册,执行then()
}
}
})
}).then(() =>{
//第二步
//新增sql字段信息
let addSql = 'INSERT INTO user(user_name,user_password,time) VALUES (?,?,?)';
let addSqlParams = [result.username, result.password, time];
connection.query(addSql,addSqlParams,(error2,response2) =>{
if(error2){
throw error2;
}else{
console.log('sql新增成功')
console.log(response2);
// 接口返回数据
res.write(JSON.stringify({
code: "0",
message: "注册成功!"
}));
//结束响应
res.end();
}
})
})
}
}
})
break;
case 'GET':
console.log('get方式')
break;
}
}).listen(7777);
// 获取当前时间
function getNowFormatDate() {
var date = new Date();
var year = date.getFullYear(); // 年
var month = date.getMonth() + 1; // 月
var strDate = date.getDate(); // 日
var hour = date.getHours(); // 时
var minute = date.getMinutes(); // 分
var second = date.getMinutes(); // 秒
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
// 返回 yyyy-mm-dd hh:mm:ss 形式
var currentdate = year + "-" + month + "-" + strDate + " " + hour + ":" + minute + ":" + second;
return currentdate;
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>演示代码</title>
</head>
<body>
<div>
<label for="user">用户名</label><input type="text" id="user">
</div>
<div>
<label for="password">密 码</label><input type="password" id="password">
</div>
<div>
<button id="register">注册</button>
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
$(function () {
// 测试 get 接口
// $.ajax({
// url: "http://localhost:8888/getMessage",
// type: "POST",
// data: {
// username: "jsliang"
// },
// success: function (res) {
// console.log(res);
// },
// error: function (err) {
// console.log(err);
// }
// })
$("#register").click(function () {
// 测试 post 接口
$.ajax({
url: "http://localhost:7777/register",
type: "POST",
data: {
username: $("#user").val(),
password: $("#password").val()
},
success: function (res) {
alert(res.message);
},
error: function (err) {
console.log(err);
alert(err.message);
}
})
})
});
</script>
</body>
</html>
神奇!!!