2.14-更多问题
2.14 FAQ¶
某些 css 文件不生效¶
检查文件路径没有问题。把这部分代码拷贝到其他能用的代码中,不生效,检查是类名写错了。
reactstrap 样式不生效¶
没有引入 bootstrap.min.css 类
静态资源引用路径¶
静态资源(图片、字体文件)是否需要打包到 JS 中?目前图片已经打包,但是字体图标没有打包,未来图片是否存在无法显示的问题等?
remove useless dependencies¶
run depcheck
and get
refrence:
- https://www.pluralsight.com/guides/how-to-remove-unused-dependencies-in-react
- https://simondosda.github.io/posts/2021-05-10-eslint-imports.html
- https://dev.to/manitej/remove-unused-npm-modules-in-less-than-30-seconds-4g8k
更新后发现报错,原因是 eslint 版本升级造成的,需要更新 eslintrc @babel/eslint-parser 依赖
自动生成 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();