Node.js Messenger BOT用node-fetch从URL取数报500 如何修复代码
问题排查与修复方案
以下是你代码中存在的问题和修复后的完整代码:
现存问题
await关键字仅可在async标记的异步函数中使用,你的handleMessage是普通同步函数,直接使用await会抛出语法错误,这是触发500响应的核心原因- fetch请求地址硬编码为固定字符串
'url.com',未使用用户发送的实际URL,且缺少http/https协议头,无法正常发起请求 - else代码块内重复声明了
response变量,和外层的response变量冲突导致变量覆盖 - 未添加异常捕获逻辑,fetch请求出现网络错误、响应失败时会直接抛出异常触发500
- 原代码未等待异步请求返回就调用
callSendAPI,会导致响应内容异常
修复后代码
// 给函数添加async标识,支持await语法 async function handleMessage(sender_psid, received_message) { let response; let nhan; // 提前声明变量,避免作用域问题 // 检查消息是否包含文本 if (received_message.text) { switch (received_message.text.replace(/[^\w\s]/gi, '').trim().toLowerCase()) { case "room preferences": response = setRoomPreferences(sender_psid); break; default: var address = received_message.text; // 兼容无协议的URL,自动补全https if (!/^https?:\/\//i.test(address)) { address = 'https://' + address; } var q = url.parse(address, true); if(q.host == null){ nhan = '未检测到有效URL'; } else { try { // 使用用户发送的实际地址发起请求,添加异常捕获 const fetchRes = await fetch(address); // 校验请求是否成功 if (!fetchRes.ok) { nhan = `请求失败,状态码:${fetchRes.status}`; } else { const body = await fetchRes.text(); nhan = body; } } catch (err) { nhan = `请求出错:${err.message}`; } } response = { "text": `${nhan}` }; break; } } else { response = { "text": `抱歉,我无法理解你发送的内容。` } } // 发送响应消息 callSendAPI(sender_psid, response); }
内容的提问来源于stack exchange,提问作者blacka247
相关产品推荐
相关产品推荐

