This is my promised bcrypt from a project that I did some time ago. Bluebird is really not needed for such a small simple library.
module.exports = { makeUser: function(username, password){ return new Promise(function(resolve, reject) { bcrypt.genSalt(10, function(err, salt){ bcrypt.hash(password, salt, null, function(err, hash) { if (err) { console.log("hashing the password failed, see user.js " + err); reject(err); } else { console.log("hash was successful."); resolve(hash); } }) }) }) .then(function(hash){ return db.createUser(username, hash) }) }, login: function(username, password){ return db.userFind(username) .then(function(userObj){ if(!userObj){ console.log("did not find " + username + " in database."); return new Promise(function(resolve, reject){ resolve({login:false, message:"Your username and/or password are incorrect."}) } } else { console.log("found user: " + userObj._id, userObj); return new Promise(function(resolve, reject){ bcrypt.compare(password, userObj.hashword, function(err, bool) { resolve({bool:bool, user:userObj._id, mindSeal: userObj }) }) }) } }) } }
Usage example:
app.post('/signup', function(req, res) { var username = req.body.username; var password = req.body.password; var user = handler.userExists(username) .then(function(answer){ if (answer !== null){ console.log(req.body.username + " was taken") res.send({login: false, message: req.body.username + " is taken"}); return null; } else if (answer === null) { console.log("username not taken") return handler.makeUser(username, password); } }) .catch(function(err){ console.log("error during user lookup:", err); res.status(404).send({message:"database error:", error:err}); }) if (user !== null){ user .then(function(x){ console.log("this is returned from handler.makeUser: ", x) console.log(x.ops[0]._id) req.session.user = x.ops[0]._id; var mindSeal = { userSettings: { username: x.ops[0]._id, newCardLimit: null, tValDefault: 128000000, lastEdit: req.body.time, todayCounter: 0, allTimeCounter: 0, cScaleDefault: {0: 0.9, 1: 1.2, 2: 1.8, 3: 2.5}, accountMade: req.body.time }, decks: {} }; handler.setMindSeal(req.session.user, mindSeal, req.body.time); res.send({ login: true, mindSeal: mindSeal }); }) .catch(function(error){ console.log("make user error: " + error); res.status(401).send({message:"failed.",error:error,login:false}); }) } }); app.post('/login', function(req, res) { var username = req.body.username; var password = req.body.password; handler.login(username, password) .then(function(obj){ if (obj.bool){ console.log("username and password are valid. login granted."); req.session.user = obj.user; console.log("obj is:", obj) var mindSeal = {decks:obj.mindSeal.decks, userSettings:obj.mindSeal.userSettings}; console.log("mindSeal sending:", mindSeal); res.status(200).send({ login: true, message:"Login Successful", mindSeal: obj.mindSeal }); } else { console.log("password invalid") res.status(401).send({login: false, message:"Your username and/or password are incorrect."}) } }) .catch(function(error){ console.log(error); res.status(404).send({message:"database error:", error:err}); }) });
just a conceptual example; borrowed and slightly modified the old old code on the fly. Working code (I see that I want to improve it now, but it works): https://github.com/finetype/mindseal/blob/master/server.js