gpt4 book ai didi

node.js - 使用Express,如何实现常用的包装器功能来处理错误

转载 作者:行者123 更新时间:2023-12-03 08:20:02 26 4
gpt4 key购买 nike

环境: node.js,快速

我正在尝试根据Valeri Karpov( Mongoose 的创建者)所做的工作使用错误处理模式。他解释了他在本文中使用的模式The 80/20 Guide to Express Error Handling

在下面的简化服务器中,我可以成功地将错误传递到我的错误处理中间件。

const express = require('express');
const app = express();

app.set('view engine', 'ejs');

app.get('/', async function(req, res, next) {

let catStatus = false;

function answer(X) {
return new Promise( function(resolve, reject) {
if(X) {
resolve('cat does exist');
} else {
reject('whoops, cat does not exist');
}
});
}

answer(catStatus)
.then( function(data) {
res.render('index', { output: data });
})
.catch( function(error) {
next(new Error(error));
});
});

app.use( function(error, req, res, next) {

res.render('error', { error });
});

app.listen(8080, function(){
console.log('listening on port 8080');
});

但是,我坚持使用基本设置来实现他的包装器模式。我的 '/'端点内的代码是否在其 '*'端点内?

如果是这样,他的 function wrapAsync(fn)内有什么内容吗?我是否应该删除他的2条评论行并保持原样?
app.get('*', wrapAsync(async function(req, res) {
await new Promise(resolve => setTimeout(() => resolve(), 50));
// Async error!
throw new Error('woops');
}));

app.use(function(error, req, res, next) {
// Gets called because of `wrapAsync()`
res.json({ message: error.message });
});

app.listen(3000);

function wrapAsync(fn) {
return function(req, res, next) {
// Make sure to `.catch()` any errors and pass them along to the `next()`
// middleware in the chain, in this case the error handler.
fn(req, res, next).catch(next);
};
}

最佳答案

我认为*中的app.use()端点只是通配符,它​​表示将所有传入请求路由到该代码,类似于/的工作方式。

但是,是的,您理解正确。基本上,他说的是任何发出异步请求的中间件都应使用此wrapAsync函数。您可以根据需要在wrapAsync实现中删除注释行。

使用wrapAsync函数,您可以将自己的异步中间件功能传递到此包装器中,这样可以确保调用异步中间件,并且.catch()保证可以调用next,这样您在编写代码时就不必担心细节。您可以简单地抛出错误,然后异步包装失败时,异步包装器将处理Express要求调用next()的要求。

app.use("/", (req, res, next) => {
verifyRequestorPermissionsAsync(req.params)
.catch(err => {
return next(err);
});
});

使用 wrapAsync中间件,您将自动以拒绝的错误(如果有)调用下一步,因此您可以清理代码很多(以及避免意外忘记拒绝被调用)。
app.use("/", wrapAsync(async(req, res, next) => {
await verifyRequestorPermissionsAsync(req.params);
}));

如果我正确地猜出了混淆的源头,那么这两个文档/文章将帮助您解决很多问题:
  • 为什么我们甚至还要关心next并将值传递给该函数:https://expressjs.com/en/guide/error-handling.html
  • 此包装函数在做什么,它返回一个调用您的函数的函数? https://eloquentjavascript.net/03_functions.html#h_hOd+yVxaku
  • 关于node.js - 使用Express,如何实现常用的包装器功能来处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60014080/

    26 4 0
    文章推荐: ansible - 如何调试失败的 Ansible 剧本?
    文章推荐: php - 无法将Silverstripe 4错误日志写入电子邮件
    文章推荐: node.js - Node.js&Express-是否曾经创建Error对象并将其传递给中间件而没有先在路由内部声明?
    文章推荐: jquery -
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com