Node.js 这个asyncHandler函数是如何工作的?

Node.js 这个asyncHandler函数是如何工作的?,node.js,async-await,callback,Node.js,Async Await,Callback,我说的是这个函数: const asyncHandler = (fn) => (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next); getBootcamps = asyncHandler(async (req, res, next) => { const bootcamps = await Bootcamp.find(); res.status(200).json({ success:

我说的是这个函数:

const asyncHandler = (fn) => (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next);
getBootcamps = asyncHandler(async (req, res, next) => {
  const bootcamps = await Bootcamp.find();
  res.status(200).json({ success: true, count: bootcamps.length, data: bootcamps });
});
我很想一步一步地了解我们通过此功能时发生的情况:

const asyncHandler = (fn) => (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next);
getBootcamps = asyncHandler(async (req, res, next) => {
  const bootcamps = await Bootcamp.find();
  res.status(200).json({ success: true, count: bootcamps.length, data: bootcamps });
});

它根据现有函数生成一个新函数,其签名为:

(请求、恢复、下一步)
该生成函数的主体是:

return Promise.resolve(fn(req, res, next)).catch(next)
它所做的是:

  • 使用参数
    (req,res,next)
  • 将该
    fn
    调用的返回值传递给Promise.resolve()-如果它不是Promise,则将其转换为Promise
  • 当承诺被拒绝时,注册回调(
    next
您发布的代码似乎是将异步函数转换为基于
next(err)
的错误处理(最有可能是
express
框架)。然而,值得注意的是,它似乎只关心错误情况——异步函数仍然负责发送响应,从而结束请求处理

其他一些Web框架使得这一步骤变得不必要——例如,可以直接使用异步函数作为处理程序,只返回响应对象,而不是执行显式的
.json()
调用(在引擎盖下执行
res.end()
).

A是一个高阶函数,它只使用函数应用程序和早期定义的组合符来定义其参数的结果

所以我们有一个组合器,
asynchHandler
-

const asynchHandler=(fn)=>(req,res,next)=>Promise.resolve(fn(req,res,next)).catch(next)
我们有
getbootcamp
-

const getbootcamp=asynchHandler(…)
因此,我们填写了
asynchHandler
-

const getbootcamp=(fn)=>(请求、恢复、下一步)=>
Promise.resolve(fn(req,res,next)).catch(next)
其中第一个参数fn,等于-

async(请求、恢复、下一步)=>{
const Bootcamp=等待Bootcamp.find();
json({success:true,count:bootcamp.length,data:bootcamp});
}
这就变成了-

const getbootcamp=(请求、恢复、下一步)=>
Promise.resolve((异步(req、res、next)=>{
const Bootcamp=等待Bootcamp.find();
json({success:true,count:bootcamp.length,data:bootcamp});
})(请求、恢复、下一个)).catch(下一个)
因此,正如
asynchHandler
的名称所暗示的,它接受一个
fn
,它被视为一个异步处理程序
fn
可以返回一个承诺,
asynchHandler
将正确包装它,并自动连接
next
回调以正确处理错误。相关的:

这是一个有效的组合器,因为它可以防止您为需要的每个异步处理程序编写
try
-
catch
样板文件-

//没有异步处理程序
异步函数getbootcamp(req、res、next){
试一试{
const Bootcamp=等待Bootcamp.find()
json({success:true,count:bootcamp.length,data:bootcamp})
}
捕捉(错误){
下一个(错误)
}
}
相反,
asynchHandler
允许您关注“成功”路径,并自动为您处理“错误”路径-

//使用asyncHandler
const getbootcamp=asynchHandler(异步(请求、恢复、下一步)=>{
const Bootcamp=等待Bootcamp.find()
json({success:true,count:bootcamp.length,data:bootcamp})
})