Skip to content

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 和 单点登录等技术。