如果提供回调,如何制作一个可以作为函数工作的中间件?

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);
  })