Node.js API控制器中Async/Await返回未知错误排查求助
我来帮你一步步拆解这个接口的问题,结合你给出的代码片段,主要有这几个核心点需要排查:
正则表达式转义错误导致匹配异常
你代码里构建正则的部分:new RegExp('\b' + req.query.name),这里的\b在JavaScript字符串中是退格字符,而不是正则表达式里的单词边界。要在正则里表示单词边界,必须把\b转义成\\b,否则当req.query.name存在时,这个正则要么语法无效,要么匹配逻辑完全不符合预期,进而抛出异常。而你的catch块里console.l...还没写完,既没完整打印错误,也没把错误返回给客户端,自然只能看到“未知错误”。
修复示例:let regexp = new RegExp(`\\b${req.query.name}`, 'i'); query.name = {$regex: regexp};顺便把
$options: 'i'直接写在RegExp的第二个参数里,代码更简洁。Async函数未被调用,错误完全被“吞掉”
你定义了async function sendRes(),但整个getAllHost函数里根本没有执行这个函数!也就是说你的异步查询逻辑压根没跑起来。就算你漏写了调用,sendRes内部的catch块也只做了半截的日志打印,没有通过res对象把错误信息返回给客户端,导致客户端收不到明确的错误提示,你也看不到具体的错误栈。
正确的调用和错误处理方式:async function sendRes() { let hosts = []; try { hosts = await findAllHost(); res.status(200).json({data: hosts}); // 别忘了返回成功结果 } catch(err){ console.error('获取主机列表失败:', err); // 完整打印错误栈 res.status(500).json({error: '获取主机列表失败', details: err.message}); // 把错误返回给客户端 } } // 调用async函数,同时处理它可能的未捕获错误 sendRes().catch(err => console.error('sendRes未捕获错误:', err));Mongoose查询的错误处理不完整
Host.find(query)返回的是Mongoose的Query对象,虽然可以用await获取结果,但如果Mongoose存在数据库连接问题、查询语法错误(比如字段名写错),都会抛出异常。你原来的代码既没有把错误反馈给客户端,也没有完整记录错误信息,自然无法定位到底是数据库层面还是业务逻辑的问题。优化代码结构,减少嵌套冗余
其实没必要把findAllHost拆成单独的嵌套函数,直接把查询逻辑写在主异步流程里会更清晰,也更容易排查问题:export async function getAllHost(req, res) { try { let query = {}; query.company = req.query?.companyId || res.locals.payload.companyId; query.active = true; if(req.query?.name) { let regexp = new RegExp(`\\b${req.query.name}`, 'i'); query.name = {$regex: regexp}; } const hosts = await Host.find(query); res.status(200).json({data: hosts}); } catch(err) { console.error('获取主机列表错误:', err); res.status(500).json({error: '服务器内部错误', message: err.message}); } }
内容的提问来源于stack exchange,提问作者relentless-coder

