node是运行js的环境
初始化
// npm init
// npm init -y// 全部选择yes
安装包
// npm install 包名
// npm i// 安装package-lock.json里面所有的包到node_modules
// npm i 包名// 安装当前最新版,
// npm i 包名@版本号//指定版本安装
// npm i -S 包名// dependencies开发、生产环境通用,默认不加-S
// npm i -D 包名// devDependencies开发环境专用
// npm i -g 包名// 全局安装,局部包一般导入使用,全局包一般通过命令使用
// npm root -g// 查看全局安装路径:C:\Users\admin\AppData\Roaming\npm\node_modules
删除包
// npm r 包名// 局部删除
// npm r -g 包名// 全局删除
配置npm命令别名
// 在package.json的scripts中设置:"别名":"node命令",使用npm run 别名 或 npm 别名
查看配置
// npm config list
设置镜像地址
// npm config set registry https://registry.npm.taobao.org
使用包
// require("uniq")引入的是node_modules下的unip模块,该模块下的package.json下配置了main,指向了uniq.js
let uniq = require("uniq");
console.log(uniq([1, 2, 2, 3]));// [ 1, 2, 3 ]
// 导出
module.exports = {
id : 1,
log : function () {
console.log(exports === module.exports);
// false:exports跟module.exports是一个对象,重新赋值变更了module.exports的地址
}
}
module.exports.name = "zhangsan";
// 导入
const exp = require("./export.js");
console.log(exp);
exp.log();
// 导入文件模块
let fs = require("fs");
// 文件写入
// {flag:"a"}追加写入,{flag:"w"}清空写入
// fs.writeFile("./file/file1.txt","666",{flag:"a"},err => {
// if (err){
// console.log(err);
// }else {
// console.log("文件写入成功");
// }
// });
// 追加写入
fs.appendFile("./file/file1.txt","777",err => {
if (err){
console.log(err);
}else {
console.log("文件写入成功");
}
});
// 文件读取
fs.readFile("./file/file2.txt",(err, data) => {
if (err){
console.log(err);
}else {
console.log(data.toString());
}
});
// 绝对路径
console.log(__dirname);// 到文件所在目录
console.log(__filename);// 到文件本身
// 导入path模块拼接文件路径
let path = require("path");
console.log(path.join(__dirname,"file3.txt"));
console.log(path.resolve(__dirname,"file3.txt"));
// 导入http模块
const http = require("http");
// http://locahost:9000/login?id=1
const server = http.createServer((req, res) => {
// 读取请求对象
console.log(req.method);// GET
console.log(req.headers.host);// locahost:9000
const url = new URL(req.url,"http://locahost:9000");
console.log(url.searchParams.get("id"));// 1
console.log(url.pathname);// /login
// 设置响应对象
res.statusCode = 404;
res.statusMessage = "msg";
res.setHeader("content-type","text/html;charset=utf-8");
res.write("hello");
res.end("world");// end后不可以在写入
})
// 监听端口,启动服务
server.listen(9000,() => console.log("9000 服务已启动"))
express是一个node.js Web应用框架
// 导入exoress
const express = require("express");
// 创建应用实例
const app = express();
// 访问静态资源,默认路径为__dirname + "/public/index.html"
app.use(express.static(__dirname + "/public"));
// 实现跨域
const cors = require("cors");
app.use(cors());
// 读取GET请求
// http://localhost:9000/login?id=1&name=zhangsan
app.get("/login",(req,res) => {
console.log(req.path);// /login
console.log(req.query);// { id: '1', name: 'zhangsan' }
let {id,name} = req.query;
console.log(req.query.name);// zhangsan
console.log(req.get("host"));// localhost:9000
console.log(req.ip);// ::1 "127.0.0.1"
// send隐含了res.setHeader('content-type','text/html;charset=utf-8')和res.write();
res.status(500).set("id","2").send(`express=${req.query.name}`);
重定向
// res.redirect("http://www.baidu.com");
// 响应json字符串
// res.json({
// id : 3,
// name : "wangwu"
// });
读取文件
// res.sendFile(__dirname + "/file1.txt");
下载文件
// res.download(__filename);
});
// restful风格请求:很好的伪装(crud)操作意图
// http://localhost:9000/login/1/zhangsan
app.get("/login/:id/:name",(req,res) => {
console.log(req.params);// { id: '1', name: 'zhangsan' }
console.log(req.params.name);// zhangsan
res.end("restful风格请求");
});
// 读取POST请求
app.post('/user',(req,res) => {
res.send("post新增操作");
});
// put请求
app.put('/user',(req,res) => {
res.send("put修改操作");
});
// delete请求
app.delete('/user/:1',(req,res) => {
res.send("delete删除操作");
});
// 匹配所有请求方法
app.all('/user/:1',(req,res) => {
res.send("all操作任意请求");
});
app.all('*',(req,res) => {
res.send("404 请求地址未找到");
});
// 设置并监听端口,启动服务
app.listen(9000,() => {
console.log("9000 服务已启动");
});
const fs = require("fs");
// 声明中间件
function 中间件1(){}
function 中间件2(){}
// 设置全局中间件,不限个数
app.use(中间件1,中间件2,(req,res,next) => {
req.log = "中间件执行";
fs.appendFileSync("./middleware_log.txt",`${req.path} ${new Date().toLocaleString()}\r\n`);
next();// 必须放行,才能执行下一个中间件
});
// app所有的路由都会执行全局中间件
app.get("/",(req,res) => {
console.log(req.log);
});
// 路由中间件是局部作用,不限个数
app.get("/login",中间件1,中间件2,(req,res) => {
console.log(req.log);
});
// 创建模块
const express = require("express");
const router = express.Router();
router.get("/user",(req,res) => {
res.send("user");
});
module.exports = router;
// 使用
const userRouter = require("./router/userRouter");
app.use(userRouter);
// cookie
const cookie = require("cookie-parser");
app.use(cookie());
app.get("/cookie",(req,res) => {
// 读取cookie
let {id} = req.cookies;
// 设置cookie
res.cookie("id","1",{maxAge: 3 * 1000});
// 删除cookie
res.clearCookie("id");
res.send(`${id}`);
});
// session
const session = require("express-session");
app.use(session({
name : "sid",// 设置cookie的name,默认为connect.sid
secret : 'zhangsan',// 签名:参与加密的字符串
saveUninitialized : false,// 是否在每次请求设置一个cookie存储session的id
resave : true,// 是否在每次请求时重新保存session
cookie : {
httpOnly : true,// 开启后无法通过js操作
maxAge: 30 * 1000// 过期时间(毫秒)
}
}));
app.get("/login",(req,res) => {
// 读取session
let {name} = req.session;
// 设置session
req.session.name = "lisi";
// 销毁session
req.session.destroy();
res.send(`${name}`);
});
// token
const jwt = require("jsonwebtoken");
const {expressjwt} = require("express-jwt");
const secretKey = "1@Ab_*";
// expressjwt({密钥,加密算法}).unless({path[正则表达式](除此以外的路径都要校验token)})
app.use(expressjwt({secret: secretKey,algorithms: ["HS256"]}).unless({path: [/^\/api\//]}));
app.get("/api/login",(req,res) => {
// jwt生成token:签名({data},密钥,{过期时长})
const token = jwt.sign({name : 'zhangsan'},secretKey,{expiresIn : 30});
res.send(`${token}`);
});
// 在请求头中使用Authorization作为key,Bearer token作为value。才可以访问被拦截的路径
app.post("/admin",(req,res) => {
// 获取token里的数据req.auth
res.send(`${req.auth.name}`);
});
const mysql = require("mysql");
// 配置连接
const db = mysql.createPool({
host:'127.0.0.1',
port:'3306',
user:'root',
password:'123456',
database:'test'
});
const user = {
id:1,
username:'zhangsan',
password:1234567,
role:'user'
};
// 查询
let querySql = 'select * from user';
db.query(querySql,(err,result) => {
if(err){
return console.log(err);
}
console.log(result);
});
// 新增
let insertSql = 'insert into user(username,password,role) values(?,?,?)';
db.query(insertSql,['zhaoliu',123456,'user'],(err,result) => {
if (err) {
return console.log(err);
}
console.log(result);
});
// 用对象占位
let insertSql2 = 'insert into user set ?';
db.query(insertSql2,user,(err,result) => {
if (err) {
return console.log(err);
}
console.log(result);
});
// 修改
let updateSql = 'update user set ? where id = ?';
db.query(updateSql,[user,user.id],(err,result) => {
if (err) {
return console.log(err);
}
console.log(result);
});
// 删除
let deleteSql = 'delete from user where id = ?';
db.query(deleteSql,user.id,(err,result) => {
if (err) {
return console.log(err);
}
console.log(result);
});