如何解决在Node js中使用fs读取json文件时出错
我正在为节点JS和Express开发3层体系结构后端。
我必须读取带有JSON数据的文件,然后使用REST使用HTTP发送
我的问题是,即使使用throw,从fs.readFile抛出的错误也没有传播到上层。但是,该代码可与fs.readFileSync一起使用。
dao.js
const fs = require("fs");
class DAO {
async getAllProducts() {
// try {
// fs.readFileSync("products.json");
// } catch (error) {
// throw new Error("Error Reading File");
// }
fs.readFile("./products.json",(err,data) => {
if (err) {
throw new Error("Error Reading File");
} else {
let d = JSON.parse(data);
return d;
}
});
}
}
module.exports = new DAO();
service.js
const dao = require("../data/dao");
class Service {
async getAllProducts() {
try {
return await dao.getAllProducts();
} catch (error) {
throw error;
}
}
}
module.exports = new Service();
product.js
const express = require("express");
const router = express.Router();
const service = require("../service/service");
const Response = require("../models/Response");
router.get("/",async (req,res) => {
try {
const data = await service.getAllProducts();
res.status(200).send(new Response(200,"Success",null,data));
} catch (error) {
res.status(500).send(new Response(500,"Failure",error.message,null));
}
});
module.exports = router;
在点击http:// localhost:3000 / api / products并使用fs.readFileSync方法时,o / p符合预期
{
"statusCode": 500,"status": "Failure","message": "Error Reading File","data": null
}
但是在使用fs.readFile时,o / p很奇怪
{
"statusCode": 200,"status": "Success","message": null
}
并且控制台输出在下面
throw new Error("Error Reading File");
^
Error: Error Reading File
at ReadFileContext.callback (C:\Users\a\b\c\d\data\dao.js:12:11)
at FSReqCallback.readFileAfterOpen [as oncomplete] (fs.js:264:13)
我的猜测是因为readfile是一个异步fn,所以它引起了问题,但是为了解决这个问题,我在所有地方都使用了async / await,所以应该不会有问题。不知道错误在哪里。
非常感谢您的帮助
解决方法
那是因为在回调中引发了错误。该错误将不会从服务中的catch块中捕获(请检查this article,这将对此进行详细说明)。可以使用fs
的诺言代替使用回调和同步读取操作:
async getAllProducts() {
try {
const data = await fs.promises.readFile("./products.json");
return JSON.parse(data);
} catch (err) {
console.log(err); // print the orig error but throw your custom error
throw new Error("Error Reading File");
}
}
如果readFile
拒绝,则错误将立即在您的服务中被发现。
另一件事:从模块导出实例被认为是不好的做法,有关更多信息,请参见this。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。