【问题标题】:Correct way to respond to client on Node.js?在 Node.js 上响应客户端的正确方法?
【发布时间】:2014-10-11 10:32:07
【问题描述】:

这是我第一次尝试构建服务器...

我已经设置了一个服务器来处理一个包含预定义验证码字符串的联系表单提交。

当服务器接收到联系表单时,如果验证码字符串是预期的字符串,那么我希望它使用response.end(JSON.stringify(parsedURL)); 以解析后的联系表单查询的 JSON 进行简单响应

如果验证码字符串错误,我希望服务器响应“说”验证码错误,以便客户端要求用户重试。但我不知道该怎么做。

在服务器上:

var httpServer = http.createServer(function (request, response)
{
    if (/\/contactform\?....../.test(request.url))
    {
        var parsedURL = url.parse(request.url, true);
        var name  = parsedURL.query.name;
        var email  = parsedURL.query.email;
        var subject  = parsedURL.query.subject;
        var enquiry  = parsedURL.query.enquiry;
        var captcha = parsedURL.query.captcha;

        if (captcha !== "testing")
        {
           // send a "bad" response to the client and include the message "bad captcha"
        }   

        else response.end(JSON.stringify(parsedURL.query));
    }
}).listen(8080);

在客户端:

$.ajax({
   url: "/contactform?..............",
   success: function(msg)
   {
      console.log(msg);
   },
   error: function(msg)
   {
      // the "bad captcha" response should be handled here right ?
      console.log(msg); // which should be equivalent to console.log("bad captcha");
   }
});

当我使用 response.end(JSON.stringify(parsedURL)); 时,客户端 (jQuery) 认为这是“成功”。

我应该如何从服务器响应,以便执行客户端上的 ajax 请求的“错误”部分?

或者“错误”部分应该只处理服务器根本没有响应的情况,即当服务器端出现严重错误时,比如异常,真正的错误,而不是简单我的情况服务器上的评估没有预期的结果?

我是否应该在这两种情况下都使用response.end(...);:

在服务器上:

var httpServer = http.createServer(function (request, response)
{
    if (/\/contactform\?....../.test(request.url))
    {
        var parsedURL = url.parse(request.url, true);
        var name  = parsedURL.query.name;
        var email  = parsedURL.query.email;
        var subject  = parsedURL.query.subject;
        var enquiry  = parsedURL.query.enquiry;
        var captcha = parsedURL.query.captcha;
        var response = JSON.stringify(parsedURL.query);

        if (captcha !== "testing") response = "bad captcha";

        response.end(response);
    }
}).listen(8080);

在客户端:

$.ajax({
   url: "/contactform?..............",
   success: function(msg)
   {
      console.log(msg); // msg will either be the stringified object or "bad captcha"..
   }
}); 

换句话说,当服务器成功接收到请求但服务器希望让客户端知道缺少某些内容或其他情况时,是否应将来自服务器的响应作为“错误”发送(即由“错误”块在客户端的 ajax 代码上)或作为“成功”并带有适当的消息说明实际发生了什么?

【问题讨论】:

标签: node.js error-handling response server-side


【解决方案1】:

我认为你需要做的是set headers of your response。

这是一个例子:

var body = 'Sorry!';
response.writeHead(404, {
  'Content-Length': body.length,
  'Content-Type': 'text/plain' });

请参阅http://nodejs.org/api/http.html#http_response_writehead_statuscode_reasonphrase_headers 了解更多信息。

【讨论】:

  • 这个代码示例看起来是正确的,但是,我建议进行两处修改:首先,使用 403 状态代码而不是 404。其次,保留您原来的“错误验证码”正文内容,因为它描述了问题给客户。为了回答更大的问题,实际上请求存在问题时返回成功的 200 响应通常被认为是不好的做法。
  • 这只是一个简单的演示,您可以根据需要进行更改。
  • 我最终发送了这样的回复:response.writeHead(403, {"Content-Type": "text/plain"}); response.end("bad captcha"); 可以吗?顺便说一句,特洛伊,您建议的 403 代码会在浏览器的控制台上显示错误(至少在 Chrome 上)。那样行吗?我怎样才能避免这种情况?我相信像这样的控制台错误会破坏 IE,对吗?我认为 403(禁止)状态在这种情况下似乎有点“苛刻”/太多了,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多