gpt4 book ai didi

javascript - 如何为 passport.authenticate 创建可重复使用的代码?

转载 作者:行者123 更新时间:2023-11-30 13:51:56 25 4
gpt4 key购买 nike

我有多个 Controller ,每个 Controller 都有多个方法。在每种方法中,我都对用户进行身份验证,并使用身份验证返回的用户 ID 从数据库中获取数据。我正在尝试创建可重用的身份验证代码,因为代码是重复的。

在 Controller 中:

const authenticate = require('../utils/user-authenticate');

exports.getData = async (req, res, next) => {
const userId = await authenticate.user(req, res, next);
console.log(userId);
};

在身份验证中我有:

exports.user = (req, res, next) => passport.authenticate('jwt', async (error, result) => {
if (error) {
// Send response using res.status(401);
} else {
return result;
}
})(req, res, next);

console.log(userId); 总是打印undefined。这是在 Passport 完成之前打印的。看起来 async/await 没有按照我想要的方式工作。

如果我使用 await authenticate.user(req, res, next).then() 它会起作用,但是不能将结果直接分配给 userId变量?

如果我使用 return next('1'):第一次 undefined 但第二次它打印 1。

最佳答案

包装成 promise :

exports.user = (req, res, next) => new Promise((resolve, reject) => {
passport.authenticate('jwt', async (error, result) => {
if (error) {
// reject(error)
// Send response using res.status(401);
} else {

resolve(result);
}
})(req, res, next);
})

但是想一想:

//app.use or something similar
addMiddleware(authJWT);
// later in the chain
useMiddleware((req, res, next)=>{
// test auth or end chain
if(!req.JWT_user) return;
req.customField = 'one for the chain'
// process next middleware
next()
});

关于javascript - 如何为 passport.authenticate 创建可重复使用的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com