我有以下代码,但收到一条错误消息,指出我正在try 在发送重定向后修改标头.我认为这就是我处理if陈述和返回的方式.我已经修改了代码,现在重定向可以工作了,但我想我误解了逻辑.请参阅此处的第一个代码:

exports.postSignup = (req, res) => {
  const email = req.body.email;
  const password = req.body.password;
  const confirmPassword = req.body.confirmPassword;
  // check if user exist
  User.findOne({ emailAddress: email })
    .then((user) => {
      if (user) {
        console.log("user exists please log in!");
        return res.redirect("/auth/login");
      }
      const newUser = new User({
        emailAddress: email,
        password: password,
        cart: {
          products: [],
        },
      });
      return newUser.save();
    })
    .then((result) => {
        console.log("added user");
        res.redirect("/auth/login");
    })
    .catch((e) => {
      console.log(e);
      throw e;
    });
};

有效的固定版本:

exports.postSignup = (req, res) => {
  const email = req.body.email;
  const password = req.body.password;
  const confirmPassword = req.body.confirmPassword;
  // check if user exist
  User.findOne({ emailAddress: email })
    .then((user) => {
      if (user) {
        console.log("user exists please log in!");
        return res.redirect("/auth/login");
      }
      const newUser = new User({
        emailAddress: email,
        password: password,
        cart: {
          products: [],
        },
      });
      return newUser.save();
    })
    .then((result) => {
      // this makes the redirect only if the user is created
      if (result) {
        console.log("added user");
        res.redirect("/auth/login");
      }
    })
    .catch((e) => {
      console.log(e);
      throw e;
    });
};

有人能帮我弄清楚为什么早期版本不起作用吗?我只能想象我调用了两次重定向().

推荐答案

按照docs:

mongoose 查询不是promise .收件箱是thables,这意味着它们有一个.then()方法来进行收件箱c/await,以方便

我建议采用async/await模式,您可以在docs中阅读该模式,但请注意:

不同Mongoose方法的具体实现值有所不同,并且可能会受到配置的影响.有关特定方法的信息,请参阅API文档.

在代码的这一部分中:

if (user) {
   console.log("user exists please log in!");
   return res.redirect("/auth/login");
}

您将向下一个then()连锁店返还res.redirect.然后您再次拨打res.redirect.

然而,在代码的这一部分中:

return newUser.save();

您将返回已结算promise 的结果,因为save()方法是同步的.

使用async/await会是这样:

exports.postSignup = async (req, res) => { //< mark function as async
    try{
        const email = req.body.email;
        const password = req.body.password;
        const confirmPassword = req.body.confirmPassword;
        const user = await User.findOne({ emailAddress: email }); //< use await keyword
        if(user){
            console.log("user exists please log in!");
            return res.redirect("/auth/login"); //< early return
        }else{
            const newUser = new User({
                emailAddress: email,
                password: password,
                cart: {
                    products: [],
                },
            });
            await newUser.save(); //< use await keyword
            console.log("added user");
            res.redirect("/auth/login");
        }
    }catch(e){
        console.log(e);
        // handle err
    }
};

Node.js相关问答推荐

MongoServelSelection错误:服务器 Select 在30000 ms后超时

Mongoose更新许多不使用数组作为筛选器来更新记录

如何在.npmrc中添加 comments ?

如何在MongoDB中更新嵌套数组

如何在医学中按patientId查找一个并同时插入多个数据

Node.js 连接在查询完成之前终止

在 Node JS 中使用 url 链接而不是文件路径

Node.js |如何在微服务之间转发标头?

如何在不使用位置运算符 $ 的情况下更新 mongodb 文档中数组中的嵌套文档?

Cassandra node.js 驱动程序有替代品吗?

Node JS:自动 Select `http.get`与`https.get`

如何获取在 NodeJS 中执行的脚本的文件名?

Sequelize 基于关联的查找

判断一个数组中的每个元素是否都在第二个数组中

Nodejs 随机免费 tcp 端口

使用 pg-promise 进行多行插入

为什么我会收到错误:解决方法指定过多?

使用 node 的内置调试器判断变量?

如何设置 useMongoClient (Mongoose 4.11.0)?

node.js 服务器和 HTTP/2 (2.0) 与 express.js