2014-10-11 93 views
0

這是我第一次嘗試構建服務器...在Node.js上響應客戶端的正確方法?

我已經建立了一個服務器來處理聯繫人表單提交,其中還包括一個預定義的驗證碼字符串。

當服務器接收的聯繫方式,如果驗證碼字符串是一個預期的話,我想將它用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代碼中的「錯誤」塊處理)或作爲一個「成功」與適當的消息說明實際發生了什麼?

+0

看來,這個問題有答案在這裏:http://stackoverflow.com/questions/14154337/how-to-send-a-custom-http-status-message-in-node-express – xShirase 2014-10-11 01:40:02

+0

我看到,但我沒有使用快遞,我想先學習Node.js,然後建立我的路.. – 2014-10-11 01:48:18

回答

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獲得更多信息。

+0

這段代碼看起來是正確的,但是,我會建議做兩個小小的修改:首先,使用403狀態代碼,而不是404.其次,保留原始的「錯誤驗證碼」正文內容,因爲它向客戶描述了問題。而爲了回答更大的問題,通常認爲返回成功的200響應通常被認爲是不好的做法,實際上請求存在問題。 – 2014-10-11 02:37:12

+0

這只是一個簡單的演示,你可以改變它來滿足你的需求。 – creeper 2014-10-11 06:08:26

+0

我最終發送瞭如下所示的響應:'response.writeHead(403,{「Content-Type」:「text/plain」}); response.end(「bad captcha」);'那好嗎?順便說一下,Troy,您建議的403代碼會在瀏覽器的控制檯上顯示錯誤(至少在Chrome上)。這可以嗎?我怎樣才能避免這種情況?我相信這樣的控制檯錯誤可能會破壞IE,對嗎?我認爲403(禁止)狀態在這種情況下似乎有點「嚴厲」/太多了嗎? – 2014-10-11 13:31:49