Javascript 策略中的passport.js和process.nextTick
我在nodeJS中遇到了一些新情况:Javascript 策略中的passport.js和process.nextTick,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我在nodeJS中遇到了一些新情况:process.nextTick 在passport.js的一些策略代码示例中,我们可以看到 passport.use(new LocalStrategy( function (username, password, done) { // asynchronous verification, for effect... process.nextTick(function () { findByUsername(usernam
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) {
// ...
});
})
});
}
));
但在官方文件中,它没有被使用。()
我的理解是,应该使用process.nextTick
延迟同步堆栈,以避免阻塞事件。但在本战略代码中,没有任何事件
在这里这样做的好处是什么?仅在示例中说明异步身份验证是可能的。在大多数情况下,您将查询一个数据库,因此它本质上是异步的。但是,该示例只是有一组硬编码的用户,因此,
nextTick
调用就是为了有效地模拟异步函数。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));
};
也许这是应该在示例代码中保留为注释掉的块的内容?我注意到passport twitter示例代码中也有nextTick。我理解模拟异步函数的原因,但是,我没有发现任何博客示例代码不使用nextTick(而且似乎不需要)。因此,如果我们只使用
process.nextTick(函数(){
和结束}
),父函数(passport中间件)仍然可以查询DBs?