nodejs express,ajax发布w / jquery和接收响应

时间:2011-06-09 07:08:45

标签: jquery ajax node.js express

在使用express来正确响应我的jquery ajax请求时遇到一些麻烦。实际发布工作正常,但无论我尝试什么,我似乎无法从我的应用程序实际获得我可以使用的数据响应。起初它只是张贴和不断悬挂,就像一分钟之后,它会响应一个警告,说“加载XML文件”(不知道它来自哪里) - 无论如何,现在它给了我

SyntaxError:意外的令牌ILLEGAL     在解析(本机)     在IncomingMessage。

在我的快递App中,我有:

    app.post('/save', function(req, res) {
      console.log(req.body.objectData);
      res.contentType('json');
      res.send({ some: 'json' });
    });

在我的jquery中:

  $.ajax({
    url: "/save",
    type: "POST",
    dataType: "json",
    data: {objectData: someObject},
    contentType: "application/json",
    cache: false,
    timeout: 5000,
    complete: function() {
      //called when complete
      console.log('process complete');
    },

    success: function(data) {
      console.log(data);
      console.log('process sucess');
   },

    error: function() {
      console.log('process error');
    },
  });

3 个答案:

答案 0 :(得分:21)

您没有发送有效的JSON响应,而是发送包含单词json的字符串,因此JSON.parse()在客户端失败。试试这个:

app.post('/save', function(req, res) {
  console.log(req.body.objectData);
  res.contentType('json');
  res.send({ some: JSON.stringify({response:'json'}) });
});

JavaScript Object Notation是一种以对象格式在应用程序之间共享数据的方法。但是,如果没有先将对象转换为字符串并将其作为单个变量发送,则无法通过HTTP请求发送对象。函数JSON.parse()JSON.stringify()为我们执行此操作。

答案 1 :(得分:2)

牧师Bones的评论对我来说特别重要,因为我使用$ .ajax发布到Node服务器。我的相关代码部分最终如下:

// Incoming parameter "teams" is an array of objects
function saveTeams(teams) {
    var xhr;
    var data = JSON.stringify({ teams: teams });

    xhr = $.ajax({
        type: "POST",
        url: "http://localhost:8000/saveteam",
        contentType: "application/json",
        data: data,
        headers: {
            Authorization: "..."
        }
    });

    return xhr;
} 

请注意,contentType标头与解析工作相关。

在节点服务器端,我可以像这样处理有效负载:

saveTeams: function (req, res, next) {
    var teams = req.body.teams;

    if (teams.length > 0) {
        console.log("Teams to be added:");
        for (var i = 0; i < teams.length; i++) {
            console.log(teams[i]);
            // ...
        }
    }
    // ...
}

答案 2 :(得分:1)

由于您使用快递,

res.contentType('json');

应该是:

res.type('json');

但不需要设置类型,因为它是自动完成的。

请参阅express api docs on res.type

另请注意,对于express,res.send({blah:"gee"});在内部使用JSON.stringify自动转换json对象。单击上面的链接后,单击res.send,然后在您使用res.json时,当您知道要发送JSON时,这会节省一点处理器开销。请注意,如果发送JSON,则类型将自动设置为JSON。

总是最好看the source!请注意,res.send在检测到JSON时调用this.json,并且res.json调用this.send(是的,它似乎是一个循环,但一切都解决了)。