Skip to content

后端node知识

🚀 自动刷新服务器

sh
npm install nodemon

🔍 设置跨域

sh
npm i cors@2.8.5
js
// 导入 cors 中间件
const cors =require('cors')
// 将 cors 注册为全局中间件,允许跨域请求 
app.use(cors())
// 设置指定域名访问
app.use(cors({
  origin: [
    'http://localhost:8080'
  ]
}));

📖 服务器

sh
npm install express
js
// 引入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 mysql
js
// 连接数据库
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 multer
js
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 jsonwebtoken
js
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.3
js
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) => {
      // 流处理过程中发生错误的处理逻辑
    });  
});