如何正确发送针对不同确认/错误情况的ajax请求的响应?

时间:2014-01-28 02:43:25

标签: jquery ajax node.js http

我目前正在使用以下架构:我有一个包含少量字段的表单,我使用ajax请求提交它(使用jquery表单插件:http://jquery.malsup.com/,并验证插件:http://jqueryvalidation.org/

指示是否可以成功处理此请求(只能在数据库中创建唯一对象)或者未正确填充(对于intance必须使用db检查)等等我使用node.js发送以下响应:

    res.writeHead(204, {'content-type': 'text/plain'});
    res.write("exists");
    res.end();

    res.writeHead(400, {'content-type': 'text/plain'});
    res.end();

        res.writeHead(200, {'content-type': 'text/plain'});
        res.write("Product created: " + product);
        res.end();

在客户端接收后,我使用以下ajaxSumit调用选项解析它:

var form_options = {  

  success: function(restxt, ststxt, xhr){

    $("#submit_button").prop( "disabled", false);

    // console.log("status text: " + ststxt);
    if ( xhr.responseText.match(/.*notanimage.*/) ){
      showErrorAlert("Uploaded not an image file!"); 
      // clears the file input after good product submission
      $(".fileinput").fileinput('clear');
    }   
    // 204 code used here 
    // error code for product already existing in the database
    else if (ststxt == 'nocontent'){
      showErrorAlert("Product \"" + product_name + "\" already exists in the database."); 
      // clears the file input after good product submission
      $(".fileinput").fileinput('clear');
    }   
    //  
    else if(ststxt == 'success' ) { 
      showInfoAlert("Product \"" + product_name + "\" submitted successfully."); 
      // clears the file input after good product submission
      $(".fileinput").fileinput('clear');
    } else {
      showErrorAlert("Problem with submitting this form, with following error: \"" + ststxt + "\"");
    }   
  },

  error: function(){
    showErrorAlert("Problem with submitting this form.");
    $("#submit_button").prop( "disabled", false);
   }   
};

这是正确的方法,还是有其他方式我应该从服务器端发送它并在客户端以不同方式解析它?

修改

问题是当我发送409产品已经存在时,我在控制台/浏览器中收到错误而不是响应文本:

POST https://localhost:8443/ 409 (Conflict) 

2 个答案:

答案 0 :(得分:1)

使用AJAX(现在应该真的称为AJAJ,哈哈),我通常更喜欢发送JSON响应:

res.writeHead(204, {'content-type': 'application/json'});
res.write(JSON.stringify({ success: false, error: 'exists' });

或者:

res.writeHead(200, {'content-type': 'application/json'});
res.write(JSON.stringify({ success: true });

很多人喜欢在发生故障时设置error属性,缺少该属性表示成功。我认为最好包含一个success属性,因为它消除了错误“成功”的可能性。然后你可以这样检查一下:

$.ajax('/ajax/myfunc', {
    success: function(data) {
        if(data.success){
          console.log('yay!');
        } else {
          console.log('boo!');
        }
    });

无论如何,这是我更喜欢的方法。

答案 1 :(得分:0)

似乎“已经存在”应该是409.此外,“created”应该是带有Location头字段的201.