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
相关产品推荐
相关产品推荐

