Express.js中req.body随机未定义问题求助
问题:req.body 偶尔未定义,间隔请求又恢复正常
我遇到一个问题:有时候 req.body 会出现未定义的情况,但几分钟后再次发起请求,又能正常获取到对应数据。需要各位帮忙排查。
相关代码
index.js
const http = require('http'); const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const LogRequests = require('./logger.js'); const query = require('./querys.js'); const hostname = '192.168.25.48'; const port = 5050; const server = http.createServer(app); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({limit: '100mb', extended: true})); app.use(express.static(__dirname + '/public')); app.use(LogRequests); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); }); app.get('/clients', (req, res) => { query.selectAllClients(req, res); });
query.js
module.exports = { selectAllClients }; async function selectAllClients(req, res) { try { connection = await oracledb.getConnection({ user: "user", password: "password", connectString: "192.168.3.5:1521/jtv" }); result = await connection.execute(`SELECT client_code, client_name FROM clients where active_ind='YES'`); } catch (err) { return res.send(err.message); } finally { if (connection) { try { await connection.close(); } catch (err) { console.error(err.message); } } if (result.rows.length == 0) { return res.send({ rows: 0 }); } else { res.setHeader('Content-Type', 'application/json'); var JSONresult = JSON.stringify(result.rows); return res.status(200).send(JSONresult); } } }
日志情况
异常请求日志(响应body为空)
{ "time": "2023/04/22 18:47:50", "host": "192.168.25.48", "ip": "192.168.25.197", "originalUrl": "/clients", "method": "GET", "path": "/clients", "url": "/clients", "body": {}, "params": {}, "query": {}, "response": { "body": "" } }
正常请求日志(响应body有数据)
{ "time": "2023/04/22 18:47:38", "host": "192.168.25.48", "ip": "192.168.25.197", "originalUrl": "/clients", "method": "GET", "path": "/clients", "url": "/clients", "body": {}, "params": {}, "query": {}, "response": { "body": "[{\"CLIENT_CODE\":\"DEFAULT\",\"CLIENT_NAME\":\"1 - Default Pricing\"},{\"CLIENT_CODE\":\"INTERNAL\",\"CLIENT_NAME\":\"Internal Client\"}]" } }
排查与解决方案
1. 修复全局变量污染问题
你的 connection 和 result 变量未用 let/const 声明,属于全局变量。当多个请求并发时,后一个请求会覆盖前一个请求的变量值,导致异常返回。
修复代码:
async function selectAllClients(req, res) { let connection; // 声明局部变量 let result; try { connection = await oracledb.getConnection({ user: "user", password: "password", connectString: "192.168.3.5:1521/jtv" }); result = await connection.execute(`SELECT client_code, client_name FROM clients where active_ind='YES'`); } catch (err) { return res.status(500).send(err.message); } finally { // 后续逻辑不变 } }
2. 完善错误日志与响应
当前代码在数据库操作出错时,仅返回错误信息但未记录日志,难以定位问题。建议添加错误日志输出,同时返回标准错误响应:
catch (err) { console.error('数据库操作异常:', err); return res.status(500).send({ error: err.message }); }
3. 检查日志中间件逻辑
确认 LogRequests 中间件是否会意外修改 req.body 或提前结束响应。查看 logger.js 代码,确保没有错误调用 res.end() 或 res.send() 导致后续流程中断。
4. 改用数据库连接池提升稳定性
每次请求创建/关闭连接容易引发不稳定问题,建议使用连接池管理数据库连接:
// 在模块初始化时创建连接池 async function initPool() { try { await oracledb.createPool({ user: "user", password: "password", connectString: "192.168.3.5:1521/jtv", poolMin: 2, poolMax: 10, poolIncrement: 1 }); } catch (err) { console.error('连接池初始化失败:', err); process.exit(1); } } initPool(); async function selectAllClients(req, res) { let connection; let result; try { connection = await oracledb.getConnection(); // 从连接池获取连接 result = await connection.execute(`SELECT client_code, client_name FROM clients where active_ind='YES'`); } catch (err) { console.error('数据库操作异常:', err); return res.status(500).send({ error: err.message }); } finally { if (connection) { try { await connection.close(); // 归还连接到池 } catch (err) { console.error('归还连接失败:', err); } } // 后续逻辑不变 } }
内容的提问来源于stack exchange,提问作者iStealth
相关产品推荐
相关产品推荐

