我在nodeJS面临一些新的事情:process.nextTick
在passport.js的一些策略代码示例中,我们可以看到
passport.use(new LocalStrategy(
function (username, password, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
findByUsername(username, function (err, user) {
// ...
bcrypt.compare(password, user.password, function (err, res) {
// ...
});
})
});
}
));
但是在官方文档中,没有使用它。 (http://passportjs.org/guide/username-password/)
我的理解是process.nextTick
应该用于推迟同步堆栈以阻止事件。但是在这个策略代码中,没有事件。
这样做有什么好处?
答案 0 :(得分:16)
仅在示例中显示可以进行异步身份验证。在大多数情况下,您要查询数据库,因此它本质上是异步的。但是,该示例只有一组硬编码的用户,因此nextTick
调用可以生效,以模拟异步函数。
答案 1 :(得分:0)
100%ES6正常工作,因此您可以删除nextTick
我在服务器端使用babel和webpack来实现:
从护照';
导入护照const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
const manipulateUser = async (User, profile, done, token) => {
try {
const user = await User.findOne({ googleId: profile.id });
if (user) {
user.accessToken = token;
await user.save();
return done(null, user);
}
const newUser = new User();
newUser.googleId = profile.id;
newUser.name = profile.displayName;
newUser.avatar = profile.photos[0].value;
newUser.accessToken = token;
profile.emails.forEach((email) => { newUser.emails.push(email.value); });
await newUser.save();
return done(null, newUser);
} catch (err) {
console.log('err at manipulateUser passport', err);
return done(err);
}
};
const strategy = (User, config) => new GoogleStrategy({
clientID: config.googleAuth.clientID,
clientSecret: config.googleAuth.clientSecret,
callbackURL: config.googleAuth.callbackURL,
}, async (token, refreshToken, profile, done) => manipulateUser(User, profile, done, token));
export const setup = (User, config) => {
passport.use(strategy(User, config));
};