Skip to content

2.14-更多问题

2.14 FAQ

某些 css 文件不生效

检查文件路径没有问题。把这部分代码拷贝到其他能用的代码中,不生效,检查是类名写错了。

reactstrap 样式不生效

没有引入 bootstrap.min.css 类

静态资源引用路径

静态资源(图片、字体文件)是否需要打包到 JS 中?目前图片已经打包,但是字体图标没有打包,未来图片是否存在无法显示的问题等?

remove useless dependencies

run depcheck and get

refrence:

更新后发现报错,原因是 eslint 版本升级造成的,需要更新 eslintrc @babel/eslint-parser 依赖

https://stackoverflow.com/questions/70386909/problem-with-babel-eslint-parsing-error-require-of-es-module

自动生成 eslint 配置文件

npm init @eslint/config

参考 https://www.npmjs.com/package/eslint#installation-and-usage

服务端无法连接数据库

Access denied for user 'root'@'172.18.0.1' (using password: YES)

通常是数据库没有开启,或者无法连接

服务器无法运行

可能是 node 不支持 ES6 语法,运行服务前,需要用 babel 编译成 es5 后才能执行。

请求跨域

前端和后端端口号不一致,目前后端设置允许跨域

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();
  }
});

发送请求时,数据库报错

错误日志

/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

更新 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

token 在不同页面传参校验

登录页面验证后,如何在不同页面传参,目前使用 url search 参数传递 token。未来考虑 session 和 单点登录等技术。

数据库端口号冲突

默认 mysql 的端口号是 3306 端口,如果本地装有多个 mysql 数据库,例如 docker 内部也跑的一个,可能造成另一个无法正常启动。

实际环境中不可能有两个 mysql 在不同的端口跑。所以可以本地只开发一个项目,或者临时改一下数据库的端口号等。

数据库存储小说会不会太长

查阅数据库资料,logntext 字段的长度足够长,存放一个 10MB 的小说也绰绰有余。

执行查询语句时,可以不返回小说详情,先返回小说的标题等信息,这样查询的速度回更快。

如果用户上传了非法文件(超过了最大上传限制),那么提示错误,不支持上传;如果少数文件特别大,可以直接放在服务器硬盘上,不需要放在数据库中。

数据库分页查找

如果想加载某个章节的数据,能否从 longtext 字段中返回指定的字符串,不需要一次性返回全部的页面

数据的创建时间

数据库执行增加操作时,通常需要 create_time 字段。这个字段可以在三个场景生成:

1、前端发出请求时,使用 new Date() 获取客户端发出请求的时间(不建议使用,也不利于网络请求)

2、后端接收到请求时,使用服务器的时间,例如 Django 或者 nodejs 的时间。

# python 内置函数
from datetime import datetime
current_time = datetime.now()
# django 内置函数
from django.utils import timezone
current_time = timezone.now()
// nodejs 内置函数
let current_time = new Date();

3、数据库执行操作时,使用 NOW() 函数生成写入数据的时间

因为后端服务和数据库设置的时间可能是一样的,也可能设置不一样的,所以这里的结果可能不同。目前个人项目中使用 NOW 函数生成创建的时间,其他项目中也有使用服务器的时间。

实际上还需要考虑服务器多机部署,集群部署等等问题,这个也需要考虑到时区问题。这也是不同服务器数据不同步的原因。如果都是国内的节点,那么数据库和服务器都设置东八区即可。

两个表是否进行关联的分析

在其他案例中,员工表和部门表实现了外键关联,因为这个功能是强相关的。员工必须选择一个部门,删除部门时,或者删除员工时,必须同步更新另一个表。

其他项目中,用户和评论的关系是一对多的关系,但是在 MYSQL 中并没有进行外键约束。因为这个评论和用户不属于核心业务,删除用户时也不会删除对应的评论。这个场景就使用了单表操作。

当前阅读器项目中,用户和评论的关系,也是一对多的关系,目前选择使用外键进行约束,主要作为练习。

结论:两个表是否进行关联,需要看业务场景,如果更新一个数据,需要对另一个数据进行强关联,那么就使用外键约束,否则单表也可以完成任务。

ClientClosedError: The client is closed

出现报错:ClientClosedError: The client is closed 这是因为 redis 的语法是 3.x 版本,最新的版本是 4.6 不匹配。

解决方案 1:可以本地重新安装旧版本,然后建立连接。目前使用这个方案。

npm install --save redis@3.1.2

解决方案 2:使用 redis 4 的语法

https://www.npmjs.com/package/redis

import { createClient } from "redis";

const client = await createClient()
  .on("error", (err) => console.log("Redis Client Error", err))
  .connect();

await client.set("key", "value");
const value = await client.get("key");
await client.disconnect();