Node.js中JSON请求返回undefined时应用崩溃的解决方案咨询
解决方案
你的代码崩溃来自两个未处理的错误场景:
- 接口返回非合法JSON格式时,
JSON.parse()会直接抛出异常 - 接口返回的JSON结构不符合预期(比如不是数组、数组为空、第一个元素没有
body属性)时,链式取值会抛出undefined相关错误
修复方案
你需要通过try...catch捕获解析和取值过程的所有异常,同时增加返回结构的合法性校验,修改后的代码如下:
if(msg.body.startsWith('Track ')){ // 修复原有判断逻辑bug:原代码中判断时slug还未定义,会触发undefined错误 const str = msg.body; const slug = str.substring(str.indexOf("Track") + 6).trim(); // 新增trim处理,避免参数带空格导致查询失败 const http = require('https'); const options = { host: 'example.com', path: '/example/example?id=' + encodeURIComponent(slug) // 新增编码处理,避免slug带特殊字符导致请求路径异常 }; const callback = function(response) { let str = ''; response.on('data', function (chunk) { str += chunk; }); response.on('error', (err) => { msg.reply('请求发起失败,请稍后重试'); }) response.on('end', function () { try { const jsonObject = JSON.parse(str); // 新增返回结构合法性校验 if (!Array.isArray(jsonObject) || jsonObject.length === 0 || !jsonObject[0]?.body) { msg.reply(`查询${slug}失败,无有效返回数据`); return; } msg.reply('Current status of ' + slug + ': ' + jsonObject[0]['body']); } catch (err) { // 捕获JSON解析、取值过程的所有异常,避免进程崩溃 msg.reply(`查询${slug}失败,返回数据格式无效`); } }); } http.request(options, callback).end(); }
关键修改点说明
- 修复了原有判断逻辑的bug,改为用
startsWith识别输入前缀,避免未定义变量错误 - 增加了参数预处理逻辑,降低无效请求出现的概率
- 用
try...catch包裹JSON解析和取值全流程,所有运行时错误都会被捕获不会导致进程崩溃 - 新增了返回结构校验逻辑,提前识别不符合预期的返回格式,返回友好提示
- 错误提示增加了对应查询参数,方便定位问题
内容的提问来源于stack exchange,提问作者Ganzu
相关产品推荐
相关产品推荐

