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

NodeJS中Express不生效问题:/v1/send GET接口代码运行异常求助

Express路由代码问题分析与修复方案

存在的问题

  • 类型转换逻辑错误:else分支中直接将字符串类型的req.query.keys传入String.fromCharCode,该方法仅接收数字参数,传入字符串会被转换为0,输出不符合预期;同时parseInt会自动忽略字符串尾部的非数字字符,比如parseInt('65abc')返回65,会错误进入else分支。
  • 未做参数合法性校验:没有判断req.query.keys是否存在,空值会导致写入undefined,同时未处理cmd对象、cmd.stdin不存在/已关闭的异常场景,直接写入会触发未捕获错误导致进程崩溃。
  • 异步逻辑缺失:路由标记为async但无任何await逻辑,cmd.stdin.write存在背压机制,若写入缓存已满会返回false,此时直接返回响应会导致输入数据丢失。
  • 并发安全问题:全局变量cmdOutput、cmd在多请求并发访问时会出现数据串改,导致逻辑混乱。
  • GET请求限制:GET请求的查询参数长度存在浏览器/服务端双重限制,传输较长内容时会被自动截断。

修复方案

// 建议将路由改为POST避免参数长度限制,若必须保留GET可忽略该修改
app.post("/v1/send", async (req, res) => {
  // 统一从body取参数,GET请求可替换为req.query
  const inputKeys = req.body.keys;
  // 先判空
  if (inputKeys === undefined || inputKeys === null || inputKeys === '') {
    return res.status(400).send({msg: '缺少keys参数'});
  }

  let writeContent;
  // 用正则判断是否为纯数字字符串,替代parseInt的缺陷逻辑
  if (/^\d+$/.test(inputKeys)) {
    const charCode = parseInt(inputKeys);
    writeContent = String.fromCharCode(charCode);
  } else {
    writeContent = inputKeys;
  }

  try {
    process.stdout.write(writeContent);
    // 全局cmdOutput如果必须保留,建议改用请求作用域变量,或者加锁避免并发问题
    // 此处假设你需要全局累计,若不需要可删除,改为请求内变量存储
    cmdOutput += writeContent;
    // 判断stdin可写再写入
    if (cmd && cmd.stdin && !cmd.stdin.destroyed && cmd.stdin.writable) {
      // 处理write背压,等待写入完成再返回
      const writeSuccess = cmd.stdin.write(writeContent);
      if (!writeSuccess) {
        await new Promise(resolve => cmd.stdin.once('drain', resolve));
      }
    }
    finishRequest(req, "success");
    res.status(200).send();
  } catch (e) {
    console.error('写入失败:', e);
    finishRequest(req, "fail");
    res.status(500).send({msg: '处理失败'});
  }
});

修改说明

  • 新增参数非空校验,拦截非法请求
  • 替换parseInt+isNaN的判断逻辑为纯数字正则校验,避免非纯数字字符串错误进入字符编码转换分支
  • 修复String.fromCharCode的参数类型错误,先转数字再传入
  • 新增cmd.stdin可写状态判断,添加异常捕获避免进程崩溃
  • 处理stdin.write的背压场景,等待写入完成后再返回响应
  • 建议将路由改为POST,从请求Body获取参数避免长度限制
  • 若cmdOutput不需要全局累计,建议改为请求作用域内的变量,避免并发请求数据冲突

内容的提问来源于stack exchange,提问作者JSMasder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03