【问题标题】:End a express.js request based on conditional statements根据条件语句结束 express.js 请求
【发布时间】:2017-04-17 04:39:10
【问题描述】:

我正在使用 mongoose 的 Model.findOne 方法来查找一些新数据并将其添加到文档中。添加什么样的数据取决于条件if 语句。见下文:

companyTotal.findOne({companyName: "xyz"}, function (err, doc) {
        if (err) {
            sendJsonResponse(res, 400, err)
        } else if (doc) {

                if (req.body.q1 === "poor") {
                    doc.poor += 1;
                } else if (req.body.q1 === "okay") {
                    doc.okay += 1;
                } else if (req.body.q1 === "well") {
                    doc.well += 1;
                } else if (req.body.q1 === "very well") {
                    doc.veryWell += 1;
                } else {
                    sendJsonResponse(res, 401, {"message": "Wrong data entry."})
                }
        }
        doc.save(function (err, data) {
            if (err) {
                sendJsonResponse(res, 400, err)
            } else {
                sendJsonResponse(res, 200, data);
            }
        });

    });

如果不满足任何条件语句,我想结束请求并返回错误消息。我正在使用sendJsonResponse 函数来处理需要与状态代码一起发送给用户的任何类型的响应。

function sendJsonResponse(res, status, content) {
  res.status(status);
  res.json(content);
}

根据我的知识res.json 调用res.end(); 然后结束请求。但是每次不满足条件时都会显示错误消息但仍然运行doc.save() 方法并将数据添加到文档中。

我做错了什么?如果条件不满足,如何在 if 语句中结束请求?

【问题讨论】:

  • @AJS 已经在里面了。它位于companyTotal.findOne(). 的右括号之前
  • 尝试在 res.json(content) 之前添加“return”;
  • 试试这个:function sendJsonResponse(res, status, content) { return res.status(status).json(content); }
  • @TanLe 我试过return语句。它仍然会添加数据并给我can't set headers after they are sent 错误。
  • @Niezborala 我尝试了返回语句。它仍然会添加数据并给我can't set headers after they are sent 错误。

标签: javascript node.js express mongoose


【解决方案1】:

定义标志变量为

flag=0 ; 

然后

else {
        flag++;
        sendJsonResponse(res, 401, {"message": "Wrong data entry."})
      }

然后

if (flag ==0 ){  
doc.save(function (err, data) {
            if (err) {
                sendJsonResponse(res, 400, err)
            } else {
                sendJsonResponse(res, 200, data);
            }
        });
 } 

【讨论】:

  • 非常感谢您的回答。我会试试这个并让你知道,但我真的很想知道为什么调用sendJsonResponse 并没有结束请求。理论上它应该调用res.json。对此有什么想法吗?再次感谢。
  • @Skywalker 关于原因,有问题可以看这里:stackoverflow.com/questions/37314598/…
  • @Skywalker 它正在结束请求,但由于节点异步性质 doc.save() 在响应结束之前被调用。顺便说一句,这行得通吗?
  • @AJS 我试过你的方法,它给了我同样的问题。
  • 哦,那是安静的庭院。你有团队查看器吗?
【解决方案2】:

在我看来应该是这样的:

function sendJsonResponse(res, status, content) {
  return res.status(status).json(content); // you can send response only one 
}

和:

companyTotal.findOne({companyName: "xyz"}, function (err, doc) {
    if (err) {
        return sendJsonResponse(res, 400, err);
    } else if (doc) {
            if (req.body.q1 === "poor") {
                doc.poor += 1;
            } else if (req.body.q1 === "okay") {
                doc.okay += 1;
            } else if (req.body.q1 === "well") {
                doc.well += 1;
            } else if (req.body.q1 === "very well") {
                doc.veryWell += 1;
            } else {
                return sendJsonResponse(res, 401, {"message": "Wrong data entry."});
            }
    }
    doc.save(function (err, data) {
        if (err) {
            return sendJsonResponse(res, 400, err);
        } else {
            return sendJsonResponse(res, 200, data);
        }
    });
});

【讨论】:

  • 感谢您的回答。我试过了,但它仍然给出了同样的问题。我认为问题是当我的条件不满足时我使用sendJsonResponse,但不知何故请求并没有在那里停止并进入doc.save,它也运行sendJsonResponse`` and thats what causing the 2nd response to be sent. The request should end when the first sendJsonResponse`运行。
  • @Skywalker 这就是为什么我在所有 sendJsonResponse 调用之前添加 return 语句。
  • 我复制粘贴了您的答案并尝试了它。它仍然给出相同的错误和问题。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多