Appearance
后端node知识
🚀 自动刷新服务器
sh
npm install nodemon🔍 设置跨域
sh
npm i cors@2.8.5js
// 导入 cors 中间件
const cors =require('cors')
// 将 cors 注册为全局中间件,允许跨域请求
app.use(cors())
// 设置指定域名访问
app.use(cors({
origin: [
'http://localhost:8080'
]
}));📖 服务器
sh
npm install expressjs
// 引入express服务器
const express = require('express');
const app = express();
const port = 3000;
// 解析JSON格式的请求体
app.use(express.json());
// 中间件:设置默认的 Content-Type
app.use((req, res, next) => {
res.set('Content-Type', 'text/html; charset=utf-8');
next();
});
//GET请求
http.get('/about', (req, res) => {
const userName = req.query.name;
res.send(userName)
});
// POST请求
app.post('/submit', (req, res) => {
const data = req.body; // 这里是POST请求发送的数据
console.log(data.name);
res.send('POST request received');
});
// 启动服务器
app.listen(port, () => {
console.log(`http://localhost:${port}`);
});💡 静态资源处理
js
app.use(express.static('public'));🎯 中间件
js
// 在请求中添加中间件
app.get('/', middleware, (req, res) => {
res.send('Hello World!');
});
// 创建中间件函数
function middleware(req, res, next) {
next();
}🧩 路由模块化
js
// 子模块中
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Hello World!');
});
module.exports = router
// 主模块中
const userRouter = require('./routes/user');
app.use(userRouter)
// 导入方式2,在访问路径前面默认要添加/user
app.use('/user', userRouter);⚙️ mysql
sh
npm install mysqljs
// 连接数据库
const mysql = require('mysql');
const pool = mysql.createPool({
host: 'localhost',
port: 3306,
user: 'root',
password: '123456',
database: 'table',
connectionLimit: 20,
multipleStatements: true
});
module.exports = pool;
// 使用mysql
const pool = require("./mydb"); // 导入连接池
pool.getConnection(function (err, conn) {
// 定义sql查询语句
let sql = "select * from stu";
// 查询操作
conn.query(sql, function (err, result) {
})
});js
// 增
INSERT INTO users (username, email, age) VALUES (?, ?, ?)
// 删
DELETE FROM users WHERE id = ?
// 改
UPDATE users SET username = ?,status = ? WHERE id = ?
// id查
SELECT * FROM users WHERE id = ?
// 分页查 LIMIT每页数量 offset当前页码/从第几开始查询 page当前页码(前端发送)
const offset = (page - 1) * pageSize;
SELECT * FROM users LIMIT 10 OFFSET offset;
// 数量查
SELECT COUNT(*) AS total FROM users;
console.log(result[0].total)📦 上传文件
sh
npm install multerjs
const multer = require('multer');
// 配置Multer以存储文件
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'image/') // 确保这个文件夹存在
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + file.originalname) // 文件重命名
}
});
const upload = multer({ storage: storage });
// 设置路由处理文件上传
app.post('/upload', upload.single('file'), function (req, res, next) {
// 文件信息在req.file
// 获取上传的文件名称
const filename = req.file.filename;
console.log(`http://localhost:3000/image/${filename}`);
if (!req.file) {
return res.status(400).send('上传失败!');
}
res.send('上传成功!');
});多文件上传
把upload.single('file') 换成 upload.array('file', 12)
✅ jwt
sh
npm install jsonwebtokenjs
const jwt = require('jsonwebtoken');
// 加密
const tokenText = { name: "小张" };
const secret = 'ZhangCode';
const token = jwt.sign(tokenText, secret, { expiresIn: 60 * 60 });
// 解密
jwt.verify(token, 'ZhangCode', (err, data) => {
if (err) console.log("失败");
console.log("成功")
});token验证
把在需要权限的请求中添加中间件
js
function middleware(req, res, next) {
// 从请求头中获取token
const authHeader = req.headers['authorization'];
if (authHeader == undefined) return res.sendStatus(401); // 如果没有token,返回401
jwt.verify(authHeader, 'zhangCode', (err, data) => {
if (err) return res.sendStatus(403); // 如果token无效,返回403
req.data = data; // 将用户信息添加到请求对象上
next(); // 验证成功,继续执行下一个中间件或路由处理器
});
}🔒 数据加密
sh
npm i bcryptjs@2.4.3js
const bcrypt = require('bcryptjs')
// 对用户的密码,进行 bcrype 加密,返回值是加密之后的密码字符串
userinfo.password = bcrypt.hashSync(明文密码, 10)
// 拿着用户输入的密码,和数据库中存储的密码进行对比
const compareResult = bcrypt.compareSync(用户输入的密码, 数据库中加密的密码)Node.js Stream(流)
- 分步读取数据,避免一次性读取大量数据造成内存溢出
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
注意:
Stream流只能用于node,在浏览器中无法使用(vue/uniapp中无法使用)
js
// 下面是读取文件例子:
const fs = require('fs')
const rs = fs.createReadStream('data.txt')
rs.on('data', chunk => {
console.log(chunk)
})
rs.on('end', () => {
console.log('读取完成')
})
rs.on('error', err => {
console.log("读取文件失败", err)
})js
// 读取axios例子:
const axios = require('axios');
axios({
method: 'post',
url: 'YOUR_STREAM_ENDPOINT_URL', // 替换为你的流式接口URL
responseType: 'stream',
data: {}
})
.then(response => {
// 这里的response.data是一个Node.js的流(Stream)对象
response.data.on("data", (chunk) => {
console.log(chunk, "data");
// 处理每个数据块,例如写入文件或进行其他操作
});
response.data.on("end", (end) => {
console.log(end, "end");
// 数据接收完毕的处理逻辑
});
response.data.on("error", (error) => {
// 流处理过程中发生错误的处理逻辑
});
});