pfM*_*usk 10 asynchronous node.js express ecmascript-6 passport.js
我在if语句中有一个函数
isLoggedin()有一个异步调用.
router.get('/', function(req, res, next) {
if(req.isLoggedin()){ <- never returns true
console.log('Authenticated!');
} else {
console.log('Unauthenticated');
}
Run Code Online (Sandbox Code Playgroud)
});
我如何在这个if语句中等待isLoggedin()?
这是我的isLoggedin功能,我使用护照
app.use(function (req, res, next) {
req.isLoggedin = () => {
//passport-local
if(req.isAuthenticated()) return true;
//http-bearer
passport.authenticate('bearer-login',(err, user) => {
if (err) throw err;
if (!user) return false;
return true;
})(req, res);
};
next();
});
Run Code Online (Sandbox Code Playgroud)
Ste*_*her 15
我async/await在这里使用我的游戏代码做了这件事
假设req.isLoggedIn()返回一个布尔值,它就像下面这样简单:
const isLoggedIn = await req.isLoggedIn();
if (isLoggedIn) {
// do login stuff
}
Run Code Online (Sandbox Code Playgroud)
或者简写为:
if (await req.isLoggedIn()) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
确保你有一个async功能!
您可以这样分配函数:
req.isLoggedin = () => new Promise((resolve, reject) => {
//passport-local
if(req.isAuthenticated()) return resolve(true);
//http-bearer
passport.authenticate('bearer-login', (err, user) => {
if (err) return reject(err);
resolve(!!user);
})(req, res);
});
Run Code Online (Sandbox Code Playgroud)
然后您可以执行以下操作:
req.isLoggedin().then( isLoggedin => {
if (isLoggedin) {
console.log('user is logged in');
}
}).catch( err => {
console.log('there was an error:', err);
});
Run Code Online (Sandbox Code Playgroud)
不要尝试保持同步模式(if (req.isLoggeedin())),因为这会导致代码设计不良。相反,拥抱完全异步编码模式:一切皆有可能吧。
| 归档时间: |
|
| 查看次数: |
16847 次 |
| 最近记录: |