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)
- 将该
调用的返回值传递给Promise.resolve()-如果它不是Promise,则将其转换为Promisefn
- 当承诺被拒绝时,注册回调(
)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})
})