【问题标题】:how to use Promise with express in node.js?如何在 node.js 中使用 Promise 和 express?
【发布时间】:2016-05-04 05:39:48
【问题描述】:

我正在使用 Promise 和 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);
});

当我登录errorsArray 时,它是空的,我不知道为什么。我是 node.js 的新手。提前致谢。

【问题讨论】:

  • username = username(); 肯定不是你想要的。
  • 是的,您正在重新调整 Promise。我们需要做类似username.then(function(data){console.log(...)});
  • 你能重新写一下吗?提前致谢
  • @Bergi 我该怎么办?
  • 你了解 Promise 的概念吗?因为看起来首先你需要了解它背后的一些概念......

标签: node.js express mongoose promise synchronous


【解决方案1】:

尝试以下操作,之后请阅读以下文档 https://www.promisejs.org/ 以了解 Promise 的工作原理。

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 的基本用法。

【讨论】:

  • 不,@stackdave,它不是从 Node v0.12 开始的(!) - 请参阅 node.green
  • @anolsi 但是在承诺解决后如何将数据写入 res ?函数退出后,Express 会立即返回 res。
  • @EmanuelePaolini 我从来没有用过 Express,但就我所见,你只需要使用下一个函数。请参阅我新编辑的示例。
  • 令我惊讶的是,您没有将承诺传回给某些将确保调用 then 的快速处理程序。难道我们不需要“一些东西”来等待承诺吗?
【解决方案2】:
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 是一个全局变量,你不需要它。

【讨论】:

  • 谢谢,但为什么我们返回未定义的 console.log() 结果?我们不调用的 next() 的作用是什么?
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多