服务器返回旧数据,新增用户不显示,如何获取数据库实时数据?
问题分析与解决方案
你遇到的问题根源在于**getAll模块只在服务器启动时执行了一次数据库查询,之后一直复用缓存的结果**,而不是每次需要用户列表时都去查询最新数据。咱们一步步来修复:
1. 修复getAll模块的查询逻辑
当前你的getAll文件直接导出了一个已经执行过的Promise实例,这意味着服务器启动时就会查询一次用户表,之后所有请求都会用这次的缓存数据。把它改成一个函数,每次调用才触发查询:
// getAll file 修改后 const sqlite3 = require("sqlite3").verbose(); const db = new sqlite3.Database("./db/dbSqlite/app.db"); // 改成函数,每次调用都会重新查询数据库 const getAll = () => { return new Promise((res, rej) => { db.all(`SELECT * from users`, (err, rows) => { if (err || !rows) { res("NO_TABLE_USERS"); } else { res(rows); // 这里不需要JSON序列化再解析,直接返回rows即可 } }); }); }; module.exports = getAll;
2. 修复add函数的SQL语法错误
你的INSERT语句里password,多了一个逗号,这会导致SQL执行失败:
// addFile 修改后 const sqlite3 = require("sqlite3").verbose(); const db = new sqlite3.Database("./db/dbSqlite/app.db", sqlite3.OPEN_READWRITE); const add = (user) => { return new Promise((res, rej) => { // 去掉password后面的多余逗号 db.run(`INSERT INTO users(login, password) VALUES(?, ?)`, user, (err) => { if (err) { rej(false); // 出错时返回false } else { res(true); // 成功返回true } }); // db.serialize在这里没必要,因为只有一个操作 }); }; module.exports = add;
3. 修复路由中的调用方式
现在getAll是函数了,你需要调用它(user.getAll())而不是直接引用旧的Promise:
// route 修改后 router.post("/add", helper.isLoggedIn, helper.isAdmin, (req, res) => { let msg = "User created successfully!"; // 这里注意Object.values(req.body)的结果是否符合参数要求,确保是[login, password] user.add(Object.values(req.body)) .then((state) => { if (!state) msg = "Name already used!"; // 调用getAll函数获取最新数据 return user.getAll(); }) .then((result) => { res.render("users", { name: req.user, users: result, msg: msg }); }) .catch((err) => { // 最好加上错误处理,避免请求挂起 console.error(err); res.render("users", { name: req.user, users: [], msg: "Failed to create user!" }); }); });
额外建议
- 数据库连接可以考虑统一管理,避免每个模块都创建新的连接实例。
- 错误处理要更完善,比如在
add函数里可以把具体的错误信息传递出去,方便排查问题。
内容的提问来源于stack exchange,提问作者Miqez
相关产品推荐
相关产品推荐

