我在使用带有猫鼬的诺言来注册尚未在数据库中的新用户时遇到一些困难。这是我的代码:

exports.signup = (req) => {
  const newUser = {
    email: req.body.email,
    password: req.body.password
  };
  let result = {};
  return new Promise((resolve, reject) => {
    UserModel.findOne({email: newUser.email}, (err, existingUser) => {
      if (err) {
        return reject(err)
      } else {
        if (existingUser) {
          return reject()
        } else {
          result = newUser;
          UserModel.create(result);
          return resolve(result)
        }
      }
    })
  })
};


传入的请求值进入,但应用程序中断了finOne集合。

谁能发现错误?

非常感谢。

更新:

如果我省略猫鼬方法:

exports.signup = (req) => {
  const newUser = {
    email: req.body.email,
    password: req.body.password
  };
  return Promise.resolve(newUser);
};


一切正常,但是当然什么都没有添加到数据库中。因此,据我所知,这几乎与我的猫鼬方法有关。

最终更新:

我弄清楚了我的错误所在,但pandres95用正确的答案击败了我,因此我给了他分数。但是,我还将在下面提供我的解决方案,以详细说明在其他人遵循相同路径的情况下我搞砸了的地方。

分数不足10K的人们总是惊讶不已,他们总是可以救援的。 ;)

最佳答案

可能存在一些问题:


我注意到您没有使用回复(即res)。您正在使用哪个Web服务器库/框架?
然后,我宁愿使用return作为退出语句来管理控制流,而不是一系列内联条件。它们可能会导致意外结果。
在这种情况下,不建议使用result变量,因为:


作为范围变量,范围的更改可能是问题的一部分,并且
我认为没有必要,因为您只使用了一次。



这是我从猫鼬模式中解决相同情况的方法。

var userSchema = new Schema({
    email: String,
    password: String
});

userSchema.statics.signup = function (data) {
    return new Promise((resolve, reject) => {
        this.findOne({
            email: data.email
        }, (err, existingUser) => {
            if(err) return reject(err);
            if(existingUser) return reject();
            return this.create(data, (err) => {
                if(err) return reject(err);
                return resolve(data);
            });
        });
    });
};

return userSchema;


可以找到完整的解决方案(包括一些单元测试)here

关于javascript - Mongoose 对JavaScript的 promise ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36561078/

10-12 14:19