Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Bluebird promise作为promise api的回调_Node.js_Promise_Passport.js_Bluebird - Fatal编程技术网

Node.js Bluebird promise作为promise api的回调

Node.js Bluebird promise作为promise api的回调,node.js,promise,passport.js,bluebird,Node.js,Promise,Passport.js,Bluebird,我想向passport的done回调函数传递一个承诺。如果我使用bluebirdpromise库,我将如何处理这个问题 我知道有一个promission主题,有一个asCallback和fromCallback,但我不能从示例中得到这个想法 exports.signup = new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true },

我想向passport的done回调函数传递一个承诺。如果我使用
bluebird
promise库,我将如何处理这个问题

我知道有一个promission主题,有一个
asCallback
fromCallback
,但我不能从示例中得到这个想法

exports.signup = new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
  },
  (req, email, password, done) => {
    ...
    return done(null, false, {type: 'warning', message: 'Email is in use.'})
    ...
  }
);
编辑:

这就是我想要实现的目标:

exports.signup = new LocalStrategy({
  usernameField: 'email',
  passwordField: 'password',
  passReqToCallback: true,
  passportLocalCallback
});

function passportLocalCallback(req, email, password, done) {
  return new Pormise((resolve, reject) => {
    return User.findOneAsync({email: email});
  })
  .then((existingUser) => {
    if (existingUser) {
      resolve([null, false, {type: 'warning', message: 'That email is already taken.'}])
    }
    return User.generateHash(password);
  })
  .then((hash) => {
    return User.createAsync({
      email: email,
      password: hash
    })
  })
  .catch((err) => reject(err));
}

我不认为你能让它和promisification工具一起工作,主要是因为Passport也有一个有效的3参数回调情况,这是Bluebird不知道的(我想)

目前我能想到的唯一解决方案是:

function passportLocalCallback(req, email, password, done) {
  User.findOneAsync({ email : email }).then((existingUser) => {
    if (existingUser) {
      return done(null, false, {type: 'warning', message: 'That email is already taken.'});
    }
    return User.generateHash(password).then( (hash) => {
      return User.createAsync({
        email    : email,
        password : hash
      })
    }).then( (user) => {
      return done(null, user);
    });
  }).catch((err) => done(err));
}
编辑:使用
asCallback()
会将代码缩短一点,但在我看来,这并不是一件简单的事情:

function passportLocalCallback(req, email, password, done) {
  User.findOneAsync({ email : email }).then((existingUser) => {
    if (existingUser) {
      return [ false, { type: 'warning', message: 'That email is already taken.' } ];
    }
    return User.generateHash(password).then( (hash) => {
      return User.createAsync({
        email    : email,
        password : hash
      })
    });
  }).asCallback(done, { spread : true });
}

(未测试)

我不确定这是否有效,因为Passport要求使用特定参数调用
done()
(如果身份验证成功,则表示用户的对象;如果身份验证失败,则表示错误的对象)。你能详细说明你到底想做什么吗(比如,承诺从哪里来)。@robertklep我更新了问题,希望现在问题更清楚了。我很确定这可以通过bluebird promisification utils实现,但不清楚如何实现。
new Pormise((解析,拒绝)=>{return User.findOneAsync({email:email});})
肯定是错误的。不仅是因为打字错误,而且因为你不能从构造函数回调返回任何东西。啊,我明白了,所以在构造函数cb中,我不需要使用
return
,因为它将首先出现在
中,然后出现在
中。但这意味着我将不得不在许多场景中混合回调风格和承诺,我认为这会造成很多混乱。我希望
asCallback
的用例能够解决这样的问题。对于多个参数,还有一个扩展选项@我编辑了我的答案以使用
asCallback()