如何使用 express-async-handler

Yul*_*ale 2 model-view-controller controller routes node.js async-await

我正在 github 上浏览一些代码:https : //github.com/linnovate/mean/blob/master/server/routes/user.route.js

但有一部分我不明白,那就是:

router.route('/')
    .post(asyncHandler(insert));
Run Code Online (Sandbox Code Playgroud)

在 npm express-async-handler 上描述为:

用于处理异步快速路由内的异常并将它们传递给快速错误处理程序的简单中间件。

他们给出了一个如何使用模块的例子,但它没有解释太多。

所以我的问题是:

  1. 第12行的insert函数是如何不带括号调用的?

  2. asyncHandler() 的作用是什么,如果你决定不使用它,代码会是什么样子?

  3. 通常在使用router.route('/').post 时,后面跟着花括号。在这段代码中,我看不到任何内容。所以我的问题是:异步函数插入router.route('/').post的函数体的一部分吗?如果没有,那么为什么没有花括号?

  4. 在第 14 行的user.controller.js 中到底导出了什么(它是一个对象,还是一个 var...)?这样导出有什么好处?为什么不直接导出函数 insert()?

先感谢您。

jfr*_*d00 5

第12行的insert函数是如何不带括号调用的?

insert此处不调用该函数。它asyncHandler()作为函数引用传递,以便稍后调用。它被asyncHandler()立即调用并返回一个.post()作为请求处理程序传递给的新函数。

asyncHandler() 的作用是什么,如果你决定不使用它,代码会是什么样子?

这是一个包装器,insert用于查找从函数返回的被拒绝的承诺,如果找到,则next(err)自动调用。

通常在使用 router.route('/').post 时,后面跟着花括号。在这段代码中,我看不到任何内容。所以我的问题是:async 函数是否插入了 router.route('/').post 的函数体的一部分?如果没有,那么为什么没有花括号?

我不确定你说的花括号是什么意思。 .post()期望传递给它的函数引用,当定义的路由匹配传入请求时,将使用一组特定参数调用该函数引用。它可以用作以下任一项:

// externally defined request handler function
router.route('/').post(someRequestHandlerFunc);

// inline defined request handler function
router.route('/').post(function(req, res, next) {
    // code here for the request handler
});
Run Code Online (Sandbox Code Playgroud)

在第 14 行的 user.controller.js 中到底导出了什么(它是一个对象,还是一个 var...)?这样导出有什么好处?为什么不直接导出函数 insert()?

我假设第 14 行,你问的是here。这只是导出此模块导出insertinsert属性上的函数。导出函数时,不使用insert(). 立即调用该函数。您只需引用函数的名称,insert即可导出对稍后可以调用的函数的引用。

导出的原因是作为对象的属性而不是仅仅导出单个函数是为了使模块可扩展,以便它可以将其他内容导出为不同的命名属性。