How to pass a third argument to a callback using Bluebird.js nodeify

后端 未结 3 742
[愿得一人]
[愿得一人] 2021-01-14 07:38

With a little help I\'ve arrived at the following code to promisify a passport.js login strategy.

var passport = require(\'passport\');
var LocalStrategy = r         


        
相关标签:
3条回答
  • 2021-01-14 07:46

    Use:

    .nodeify(done, {spread: true});
    

    This allows multiple arguments to be passed to the 'done' callback.

    More info on:

    Bluebird nodeify documentation

    0 讨论(0)
  • 2021-01-14 07:50

    I'm adding this answer to show how to use .nodeify(done, {spread: true}) (as mentioned in other answers/comments) with the original example.

    var passport = require('passport');
    var LocalStrategy = require('passport-local').Strategy;
    var Promise = require('bluebird');
    var bcrypt = require('bcrypt');
    var db = require('./db').db; //users are stored in mongo
    
    //I'm using bluebird.js for promises
    var users = Promise.promisifyAll(db.users);
    var compare = Promise.promisify(bcrypt.compare);
    
    // This strategy is used by passport to handle logins
    module.exports.localStrategy = new LocalStrategy(function(username, password, done) {
      users.findOneAsync({username: username}).bind({})
        .then(function(user) {
            if (!user) {
              return [false, { message: 'Incorrect username.' }]; <---------------
              //should be equivalent to:
              // return done(null, false, {message:'something'});
            }
            this.user = user;
            return compare(password, user.password);
        })
        .then(function(isMatch) {
          if (isMatch) {
            return this.user;
            //is equivalent to:
            // return done(null, this.user);
          }
          else {
            return [false, { message: 'Incorrect password.' }]; <---------------
            //should be equivalent to:
            // return done(null, false, {message:'something else'};
          }
        })
        .nodeify(done, {spread: true});
    });
    
    0 讨论(0)
  • 2021-01-14 08:02

    Currently, there is no way to do it with .nodeify, you can of course do it manually with .then:

    .then(function(result){
         done(/*whatever arguments you need*/);
    },function(failure){
         done(/* failure argumnets */);
    });
    
    0 讨论(0)
提交回复
热议问题