2.2-backend.md
2.2 后端技术点¶
2.2.1 服务器¶
使用 express 作为后端,目前仅考虑基本的 RestAPI 请求,不考虑性能问题(高并发,负载均衡)。
"express": "^4.18.2",
2.2.2 第三方库¶
- body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
- cookie-parser - 解析 Cookie 的工具。通过 req.cookies 可以取到传过来的 cookie,并把它们转成对象
- multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的 MIME 编码)的表单数据
- "log4js": "^6.7.1", 日志记录工具
- "jsonwebtoken": "^9.0.0", 处理 JWT 工具库
- "express-jwt": "^8.4.1", 处理 express jwt 工具库
2.2.3 参考链接¶
express 官方文档:https://www.expressjs.com.cn/starter/hello-world.html
express 基本使用:https://michael18811380328.github.io/backend/site/nodejs/20-Node.js%20Express%20%E6%A1%86%E6%9E%B6/
2.2.4 开发问题及解决¶
1、服务端无法连接数据库¶
Access denied for user 'root'@'172.18.0.1' (using password: YES)
通常是数据库没有开启,或者无法连接
2、服务器无法运行¶
可能是 node 不支持 ES6 语法,运行服务前,需要用 babel 编译成 es5 后才能执行。
3、请求跨域¶
前端和后端端口号不一致,目前后端设置允许跨域
app.all("*", function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*"); // 允许跨域
res.header("Access-Control-Allow-Headers", "content-type");
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
if (req.method == "OPTIONS") {
res.sendStatus(200);
} else {
next();
}
});
4、发送请求时,数据库报错¶
错误日志
/novel-reader/node_modules/mysql/lib/protocol/Parser.js:437
throw err; // Rethrow non-MySQL errors
Error: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:393:5)
报错是服务器返回了多个响应,应该返回一个值 res.send(data),然后 return
参考:https://blog.csdn.net/qq_48009509/article/details/121625588
5、更新 ejs 大版本的问题¶
早期的 ejs 是 2.x.x 有 npm audit 警告,所以需要升级成 3.x.x。更新之后项目无法运行,判断可能是 ejs 模板变化造成的
解决:参考报错信息,使用 EJS-Lint 工具检查格式错误,全局安装后,执行
ejslint ./src/views/*.ejs
会提示具体的错误位置,稍后手动修改 include 语法,即可正常运行
- <%- include style %>
+ <%- include('style') %>
参考
https://www.npmjs.com/package/ejs
https://github.com/RyanZim/EJS-Lint
6、token 在不同页面传参校验¶
登录页面验证后,如何在不同页面传参,目前使用 url search 参数传递 token。未来考虑 session 和 单点登录等技术。