部署后请求后端频繁触发500内部服务器错误,寻求排查方案
部署主机环境后数据库请求频繁500错误,偶尔正常响应
本地开发时站点无异常,部署至主机环境测试后出现问题:发起数据库请求时,多数情况下页面会持续加载直至出现500 Internal Server Error,仅偶尔能正常响应。
鉴于请求偶尔可正常执行,初步排除server.js端点定义及控制器逻辑的问题。以下为问题场景截图及相关代码:
- 登录请求示例:

- 请求处于挂起状态:


- 请求失败:

补充说明:使用mysql2包连接数据库,查阅资料后怀疑是连接使用不当导致(正在了解连接池,但仍有困惑)。
数据库连接文件
require("dotenv").config(); const mysql = require("mysql2"); const db = mysql.createConnection({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, waitForConnections: true, }); const connection = async () => { db.connect((err) => { if (err) throw err; console.log("数据库连接成功"); }) } exports.db = db; exports.connection = connection;
首次数据库连接校验
connection().then(() => { app.listen(port, () => { console.log(`服务器运行在...`); }); });
登录逻辑
app.post("/dev-end/api/login", async (req, res) => { await singleAccount(db, req.body.email) .then(async (response) => { if (response.code) { res.render("templateLogin"); } try { if (await bcrypt.compare(req.body.password, response.password)) { const user = { id: response._id, name: response.name }; await deleteTokenById(db, user.id.toString()); const accessToken = generateAccessToken(user); const refreshToken = jwt.sign( user, process.env.REFRESH_TOKEN_SECRET, { expiresIn: "604800s" } ); createToken(db, { _id: user.id, accessToken: accessToken, refreshToken: refreshToken, createdAt: new Date().toISOString().slice(0, 19).replace("T", " "), }).then( res .cookie("access_token", accessToken, { httpOnly: true, maxAge: 60000 * 60 * 24 * 7, }) .redirect("/dev-end/dashboard") ); } else { res.render("templateLogin"); } } catch { res.status(500).send(); } }) .catch(console.log); });
singleAccount 函数
const singleAccount = async (conn, email) => { return await read(conn).then((res) => { if (!res.code) { const result = res.find((e) => e.email.toString() === email); if (!result) { return { code: 404, msg: "未找到对应邮箱的账户", }; } return result; } return res; }); };
read 函数
const read = async (conn) => { const sql = `SELECT * FROM accounts`; return await conn.promise().query(sql) .then(([res, fields]) => res); };
内容的提问来源于stack exchange,提问作者Juan enriquez
相关产品推荐
相关产品推荐

