run bode
let promise = Promise.resolve([false, 'error message'])
let nodeify = require('bluebird-nodeify')
nodeify(promise, console.log)
# output null [ false, 'error message' ]
nodeify(promise, console.log, {spread:true});
#output null false 'error message'
In the some cases, you would expect callback in multiple arguments.
For instance when you use passport, and create a simple strategy like this. In passport "done" function, we need multiple arguments
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
let userConst = {
email: '[email protected]',
password: bcrypt.hashSync('asdf', SALT)
}
passport.use('local-simple', new LocalStrategy(
function(username, password, done) {
if (err) { return done(err); }
if (email !== userConst.email) {
return done(null, false, { message: 'Incorrect username.' });
}
if (password !== userConst.passport) {
return done(null, false, { message: 'Incorrect password.' });
}
//we have to return user here.
return done(null, user);
}
));
Here done(null, false, { message: 'Incorrect username.' }) takes three separate arguements.
When you write it in async mode, and use nodeify to pass callback, you would write something like
let userConst = {
email: '[email protected]',
password: bcrypt.hashSync('asdf', SALT)
}
passport.use('local-simple', new LocalStrategy({
// Use "email" field instead of "username"
usernameField: 'email'
}, (email, password, callback) => {
nodeify(async() => {
if (email !== userConst.email) {
return [false, {
message: 'Invalid username'
}]
}
if (!await bcrypt.promise.compare(password, userConst.password)) {
return [false, {
message: 'Invalid password'
}]
}
//after you return
//it becomes req.user
//otherwise you won't have anything
return userConst
// Use spread option when returning multiple values
// use spread
// so a callback gets convert from [1,2] => callback(null, 1, 2)
// without spread:true, it becomes [1, 2] => callback(null, [1, 2])
}(), callback, {
spread: true
})
}))
using spread, it will make sure your callback is called with multiple arguments.