使用res.send()返回数据前端报错,后台终端打印正常该如何解决?
问题原因
- 异步执行逻辑错误:
textract.fromFileWithPath是异步回调型API,你当前把res.send写在调用该方法的代码后面,会在文件读取操作完成前就提前返回响应,此时你赋值的data不是读取到的文本内容,只是textract方法的内部返回值,并非前端需要的文本数据。 - 变量重名冲突:MongoDB查询的回调参数已经命名为
data,你后续又声明了同名的const data接收textract的返回值,会覆盖原有的查询结果,引发逻辑混乱。 - 缺少错误处理逻辑:你没有对textract回调返回的
error参数做处理,文件读取失败时前端不会收到任何错误提示,只会触发超时或无意义响应。
修复方案
调整异步逻辑顺序、修正变量名、补充错误处理即可,修复后代码如下:
router.get("/api/emailtemplates/data/:subject", (req, res) => { Email_templates.find({subject: req.params.subject}, (err, queryResult) => { if (err) { console.log(err); return res.status(500).send('数据库查询失败'); } const val = queryResult[0]['template_file_link']; console.log(val); textract.fromFileWithPath(val, function( error, text ) { if (error) { console.log(error); return res.status(500).send('模板文件读取失败'); } console.log("This dox data", text); res.send(text); }); }); });
改动说明
- 把Mongo查询的回调参数重命名为
queryResult,避免变量重名覆盖 - 将
res.send移动到textract的回调函数内部,确保只有文件读取完成、拿到正确文本后才返回给前端 - 新增数据库查询、文件读取两个环节的错误处理,出错时返回对应500状态码和提示信息,避免前端接口无响应抛错
内容的提问来源于stack exchange,提问作者Achyuta Nanta Panda
相关产品推荐
相关产品推荐

