为什么我的Node.js函数无法返回SQL Server数据且提示无内容可发送
问题排查与修复方案
- 补充请求异常与状态码校验逻辑
现有代码未处理http请求报错、接口返回非2xx状态码的场景,接口404、500时返回的空内容或错误文本会直接导致后续逻辑失败,需要添加req的error事件监听,同时在响应回调中优先校验状态码是否正常。 - 新增JSON解析异常捕获
如果接口返回非合法JSON结构(比如错误页面、纯文本提示),JSON.parse会直接抛出异常,后续的字符串拼接逻辑完全不会执行,最终触发空内容判定,需要把JSON解析逻辑包裹在try...catch块中。 - 校验接口返回数据结构
你默认接口直接返回数组,但多数业务接口会把实际数据包裹在data字段下,示例结构:{"code":200,"data": [实际数据数组]},此时你直接取返回对象的length会得到undefined,循环不会执行,建议解析后先打印返回内容确认结构是否符合预期。 - 修正隐式全局变量问题
代码中options、arrRows、objRow都没有添加变量声明,属于隐式全局变量,很容易被其他逻辑篡改导致结果异常,建议补充let/const声明。
修复后代码示例
function findCasesAndSendMessage(blnExitProcess) { const http = require('http'); const options = { host: HOST, port: PORT, path: '/DailySummary', method: 'GET' }; const req = http.request(options, function (res) { // 校验响应状态码 if (res.statusCode < 200 || res.statusCode >= 300) { console.log(`接口请求失败,状态码:${res.statusCode}`); if (blnExitProcess) setTimeout(exitProcess, 10000); return; } let msg = ''; res.setEncoding('utf8'); res.on('data', function (chunk) { msg += chunk; }); res.on('end', async function () { let strMessage = ''; let arrRows = []; try { arrRows = JSON.parse(msg); // 调试时打开,确认返回结构是否符合预期 // console.log('接口返回内容:', arrRows); // 如果接口返回是带data的包裹结构,替换为下方写法 // arrRows = JSON.parse(msg).data } catch (e) { console.log('JSON解析失败,返回内容:', msg, '错误信息:', e); if (blnExitProcess) setTimeout(exitProcess, 10000); return; } // 校验返回是否为数组 if (!Array.isArray(arrRows)) { console.log('返回内容不是预期的数组结构:', arrRows); if (blnExitProcess) setTimeout(exitProcess, 10000); return; } for (let i = 0; i < arrRows.length; i++) { const objRow = arrRows[i]; // 新增字段存在性校验,避免拼接undefined if (objRow?.strText) { strMessage += objRow.strText + "\n"; } } console.log(strMessage); if (strMessage.length > 0) { console.log("Message sent!"); await sendMessage(strMessage); } else { console.log("Nothing to send!"); } if (blnExitProcess) { setTimeout(exitProcess, 10000); } }); }); // 监听请求发送异常 req.on('error', (e) => { console.log(`请求发送失败:${e.message}`); if (blnExitProcess) setTimeout(exitProcess, 10000); }); req.end(); };
内容的提问来源于stack exchange,提问作者Trè254
相关产品推荐
相关产品推荐

