You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:22