如果提供回调,如何制作一个可以作为函数工作的中间件?
how to made a middleware which can work as function if callback is provided?
我想做一个像passport.authenticate一样的中间件,可以作为中间件使用
例如
req.get('/home', middleware,(req, res)=>{
//some code
})
如果像
这样提供回调,它也可以作为一个函数工作
req.get('/home',(req,res)=>{
auth.checkAuth((err,user)=>{
//some code
})
//some code
})
................................................ ..................................................... ..
auth.js 文件
这就是我正在做的-
exports.checkAuth=async(req,res,next,callback)=>{
console.log(callback)
const token=req.header('Authorization').replace('Bearer ',"");
try{
const decodedPayload= await jwt.verify(token,secretKey);
const user=await User.findOne({_id:decodedPayload._id,'tokens.token':token});
if(!user){
throw Error("please! authenticate.")
}
req.user=user;
req.token=token;
res.locals.users=user;
if(typeof(callback)=='function'?true:false){
return callback(null,user);
}
next();
}
catch(e){
if(typeof(callback)=='function'?true:false){
return callback(e,null);
}
res.status(401).send(e);
}
}
但是我无法添加回调功能。
中间件可以访问 req、res、next,这是由 express 完成的,它们只是一种特殊的函数,其中 req、res、next 由 express 提供。所以如果我们想要一个可以作为中间件工作的函数,也可以作为一个函数工作,我们可以在其中传递一个可选的回调,我们必须将回调的默认值设置为 null :-
exports.checkAuth=async(req,res,next,callback=null)=>{
console.log(callback)
const token=req.header('Authorization').replace('Bearer ',"");
try{
const decodedPayload= await jwt.verify(token,secretKey);
const user=await User.findOne({_id:decodedPayload._id,'tokens.token':token});
if(!user){
throw Error("please! authenticate.")
}
req.user=user;
req.token=token;
res.locals.users=user;
if(typeof(callback)=='function'?true:false){
return callback(null,user);
}
next();
}
catch(e){
if(typeof(callback)=='function'?true:false){
return callback(e,null);
}
res.status(401).send(e);
}
}
现在将其用作中间件:-
req.get('/home',checkAuth,(req, res)=>{
//some code
})
将其用作带有可选回调的函数:-
req.get('/home',(req,res)=>{
auth.checkAuth((err,user)=>{
res.send(err);
})
res.send(user);
})
我想做一个像passport.authenticate一样的中间件,可以作为中间件使用 例如
req.get('/home', middleware,(req, res)=>{
//some code
})
如果像
这样提供回调,它也可以作为一个函数工作req.get('/home',(req,res)=>{
auth.checkAuth((err,user)=>{
//some code
})
//some code
})
................................................ ..................................................... .. auth.js 文件 这就是我正在做的-
exports.checkAuth=async(req,res,next,callback)=>{
console.log(callback)
const token=req.header('Authorization').replace('Bearer ',"");
try{
const decodedPayload= await jwt.verify(token,secretKey);
const user=await User.findOne({_id:decodedPayload._id,'tokens.token':token});
if(!user){
throw Error("please! authenticate.")
}
req.user=user;
req.token=token;
res.locals.users=user;
if(typeof(callback)=='function'?true:false){
return callback(null,user);
}
next();
}
catch(e){
if(typeof(callback)=='function'?true:false){
return callback(e,null);
}
res.status(401).send(e);
}
}
但是我无法添加回调功能。
中间件可以访问 req、res、next,这是由 express 完成的,它们只是一种特殊的函数,其中 req、res、next 由 express 提供。所以如果我们想要一个可以作为中间件工作的函数,也可以作为一个函数工作,我们可以在其中传递一个可选的回调,我们必须将回调的默认值设置为 null :-
exports.checkAuth=async(req,res,next,callback=null)=>{
console.log(callback)
const token=req.header('Authorization').replace('Bearer ',"");
try{
const decodedPayload= await jwt.verify(token,secretKey);
const user=await User.findOne({_id:decodedPayload._id,'tokens.token':token});
if(!user){
throw Error("please! authenticate.")
}
req.user=user;
req.token=token;
res.locals.users=user;
if(typeof(callback)=='function'?true:false){
return callback(null,user);
}
next();
}
catch(e){
if(typeof(callback)=='function'?true:false){
return callback(e,null);
}
res.status(401).send(e);
}
}
现在将其用作中间件:-
req.get('/home',checkAuth,(req, res)=>{
//some code
})
将其用作带有可选回调的函数:-
req.get('/home',(req,res)=>{
auth.checkAuth((err,user)=>{
res.send(err);
})
res.send(user);
})