Javascript 使用mongodb时如何将错误传递给节点中的父函数
我正在构建一个简单的API来更新记录,然后发送响应(使用MonogoDB) 它工作得很好,但我试图找出如何最好地处理错误,并将它们传递给路由器功能,以响应错误。我一直在读很多书,但是我想不出什么 在下面的示例中,一个请求到达Javascript 使用mongodb时如何将错误传递给节点中的父函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在构建一个简单的API来更新记录,然后发送响应(使用MonogoDB) 它工作得很好,但我试图找出如何最好地处理错误,并将它们传递给路由器功能,以响应错误。我一直在读很多书,但是我想不出什么 在下面的示例中,一个请求到达/endpoint,然后调用一个异步函数,名为updateQuery 有两种类型的失败错误,我相信我可以得到;1) MongoError和2)错误,其中我尝试更新记录,但未更新任何内容-例如,我尝试更新不存在的记录 如果出现MongoError-这些错误将被updateQue
/endpoint
,然后调用一个异步函数,名为updateQuery
有两种类型的失败错误,我相信我可以得到;1) MongoError和2)错误,其中我尝试更新记录,但未更新任何内容-例如,我尝试更新不存在的记录
如果出现MongoError-这些错误将被updateQuery
中的catch()
块拾取。在这种情况下,我的问题是,由于这被updateQuery
函数中的catch()
块捕获,因此如何将此错误传递给路由器函数,以使用错误状态代码进行响应
在第二个场景中,如以下示例中所示,我可以使用if
语句查看是否没有更新任何内容,但是我仍然不确定如何将其传递给路由器函数以发出响应。我是否使用if-else
语句?i、 e如果结果==真,则继续,否则显示错误
谢谢
路由器功能
router.put("/endpoint", async (req, res) => {
await updateQuery()
.then(() => {
res.status(200).json({ status: 201 });
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
});
async function updateQuery() {
const db = await mongoUtil.getDb();
return await db
.collection("test")
.updateOne(
{
_id: <id>,
},
{
$set: {
param: 'test'
},
}
)
.then((result) => {
if (result.nModified !== 1) {
throw new Error("Update Error");
}
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
}
更新功能
router.put("/endpoint", async (req, res) => {
await updateQuery()
.then(() => {
res.status(200).json({ status: 201 });
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
});
async function updateQuery() {
const db = await mongoUtil.getDb();
return await db
.collection("test")
.updateOne(
{
_id: <id>,
},
{
$set: {
param: 'test'
},
}
)
.then((result) => {
if (result.nModified !== 1) {
throw new Error("Update Error");
}
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
}
异步函数updateQuery(){
const db=wait mongoUtil.getDb();
返回等待数据库
.收集(“测试”)
.updateOne(
{
_id:,
},
{
$set:{
参数:“测试”
},
}
)
。然后((结果)=>{
如果(result.nModified!==1){
抛出新错误(“更新错误”);
}
})
.catch((err)=>console.error(`发生致命错误:${err}`));
}
- 首先,在我看来,将async/await与then/catch一起使用有点多余
- 其次,您只需在顶级函数中使用catch,任何错误都会被您抛出,否则服务器将被捕获
- 最后,express是一个基于中间件的框架,路由处理程序可以接收另一个参数,即“next”,它是链中的下一个处理程序,也将接收请求、响应和传递给它的其他参数,因此,例如,您可以添加一个中间件,根据收到的错误创建响应。然后您可以使用类似于
或使用try/catch语法.catch((error)=>next(error))
router.put("/endpoint", async (req, res, next) => {
try {
await updateQuery()
res.status(200).json({ status: 201 });
} catch(error) {
next(error);
}
});
您可以从捕获中重新抛出错误,但始终要问为什么要首先捕获它