如何在Node.js的Express中使用Promise?

20

我在使用Express与Promise。

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);
});

当我打印errorsArray时,它是空的,而我不知道原因。我是node.js的新手。提前致谢。


4
username = username(); 这行代码肯定不是你想要的。 - Bergi
是的,你正在返回一个 Promise。我们需要做类似于 username.then(function(data){console.log(...)}); 的事情。 - anolsi
请问您能否重新写一下这段与编程有关的内容?非常感谢。 - hu7sy
@Bergi 那我该怎么办? - hu7sy
1
你理解Promise的概念吗?因为首先你需要理解它背后的一些概念... - anolsi
我有点困惑 :-/ - hu7sy
2个回答

22

尝试以下内容,然后请阅读以下文档https://www.promisejs.org/了解承诺的工作原理。

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();
    });
});

你可能会遇到其他错误,或者有些事情不应该那样做。我只是向你展示了 Promise 的基本用法。


4
不,@stackdave,在 Node v0.12 版本中不支持此功能(!)- 请参见node.green - Erwin Wessels
@anolsi 但是在 promise 解决后,您如何将数据写入 res? Express 在函数退出时立即返回 res。 - Emanuele Paolini
@EmanuelePaolini 我从未使用过Express,但据我所见,您只需要使用下一个函数即可。请查看我的新编辑示例。 - anolsi
我很惊讶你没有将 Promise 传递回某个 Express 处理程序,以确保调用 then。我们不需要“某些东西”来等待 Promise 吗? - Laurent

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);
        });
});

你可以像这样编写干净的代码。 Promise 是一个全局变量,无需 require。

4
感谢您的提问。为什么我们返回一个console.log()结果是undefined的结果呢?而我们不调用next()函数又有什么作用呢? - eel ghEEz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接