20

I am using Promise with Express.

router.post('/Registration', function(req, res) {
  var Promise = require('promise');
  var errorsArr = [];
  function username() {
    console.log("1");
    return new Promise(function(resolve, reject) {
      User.findOne({ username: req.body.username }, function(err, user) {
        if(err) {
          reject(err)
        } else {
          console.log("2");
          errorsArr.push({ msg: "Username already been taken." });
          resolve(errorsArr);
        }
      });
    });
  }
  var username = username();
  console.log(errorsArr);
});

When I log errorsArray, it is empty and I don't know why. I am new in node.js. Thanks in advance.

hu7sy
  • 983
  • 1
  • 13
  • 47

2 Answers2

21

Try the following, and after please read the following document https://www.promisejs.org/ to understand how the promises work.

var Promise = require('promise');
router.post('/Registration',function(req,res,next) {
    function username() {
        console.log("agyaaa");
        return new Promise(function(resolve,reject) {
            User.findOne({"username":req.body.username}, function(err,user) {
                if (err) {
                    reject(err)
                } else {
                    console.log("yaha b agyaaa");
                    var errorsArr = [];
                    errorsArr.push({"msg":"Username already been taken."});
                    resolve(errorsArr);
                }

            });
        });
    }
    username().then(function(data) {
        console.log(data);
        next();
    });
});

You can have other errors also (or things that shouldn't be done that way). I'm only showing you the basic use of a Promise.

anolsi
  • 529
  • 1
  • 11
  • 21
  • 4
    No, @stackdave, it does not as of Node v0.12 (!) - see [node.green](http://node.green/#ES2015-built-ins-Promise). – Erwin Wessels Aug 10 '17 at 07:16
  • @anolsi but how do you write your data into res after the promise has resolved? Express is returning res as soon as the function exits. – Emanuele Paolini Aug 19 '17 at 10:37
  • @EmanuelePaolini I never used Express, but for what I see, you only need to use the next function. See my new edited example. – anolsi Aug 19 '17 at 17:54
  • I'm surprised that you don't pass back the promise to some express handler that is going to make sure the `then` is called. Don't we need "something" to wait over the promise? – Laurent May 19 '18 at 18:28
1
router.post('/Registration', function(req, res) {
    return User
        .findOne({ username: req.body.username })
        .then((user) => {
            if (user) {
                return console.log({ msg:"Username already been taken" });
            }
            return console.log({ msg: "Username available." });
        })
        .catch((err)=>{
            return console.error(err);
        });
});

you can write a clean code like this. Promise is a global variable available you don't need to require it.

Ilya Volodin
  • 10,929
  • 2
  • 45
  • 48
  • 4
    Thanks but why do we return a result of console.log() which is undefined? What's the role of next() that we do not call? – eel ghEEz Mar 16 '18 at 21:42