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

nodejs-express、ajax发布w/jquery和接收响应,jquery,ajax,node.js,express,Jquery,Ajax,Node.js,Express,让express正确响应我的jQueryAjax请求时遇到一些问题。实际发布效果很好,但无论我怎么尝试,我似乎都无法从我的应用程序中获得我可以使用的数据响应。起初,它只是不断地发布和挂起,一分钟后,它会发出一个警报,说“XML文档已加载”(不知道它从哪里来)——不管怎样,现在它给了我 SyntaxError:意外标记非法 在解析时(本机) 在收到消息时。 在我的express应用程序中,我有: app.post('/save', function(req, res) { co

让express正确响应我的jQueryAjax请求时遇到一些问题。实际发布效果很好,但无论我怎么尝试,我似乎都无法从我的应用程序中获得我可以使用的数据响应。起初,它只是不断地发布和挂起,一分钟后,它会发出一个警报,说“XML文档已加载”(不知道它从哪里来)——不管怎样,现在它给了我

SyntaxError:意外标记非法 在解析时(本机) 在收到消息时。 在我的express应用程序中,我有:

    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');
    },
  });

您发送的不是有效的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'}) });
});

是一种以对象格式在应用程序之间共享数据的方法。但是,如果不先将对象转换为字符串并作为单个变量发送,则无法通过HTTP请求发送对象。函数
JSON.parse()
JSON.stringify()
为我们完成了这一任务。

因为您使用的是express

res.contentType('json');
应该是:

res.type('json');
但是设置类型不是必需的,因为它是自动为您完成的

还要注意,对于express,
res.send({blah:gee})在内部使用json.stringify自动转换json对象。单击上面的链接后,单击
res.send
,并在执行此操作时单击
res.json
,这样在您知道正在发送json时可以节省一点处理器开销。请注意,如果发送JSON,类型将自动设置为JSON


总是最好看的!请注意,res.send在检测到json时会调用this.json,res.json会调用this.send(是的,看起来像是一个循环,但一切正常)。

Pastor Bones的评论对我特别重要,因为我使用$.ajax发布到节点服务器。我的代码相关部分的结尾如下:

// 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;
} 
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]);
            // ...
        }
    }
    // ...
}
请注意,contentType头与解析工作相关

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

// 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;
} 
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]);
            // ...
        }
    }
    // ...
}
saveTeams:函数(请求、恢复、下一步){
var团队=需求主体团队;
如果(团队长度>0){
console.log(“要添加的团队:”);
对于(var i=0;i
标记不适用于node.js您可以打开chrome调试器检查器并查看请求正文的JSON内容吗?您看到的错误是服务器端JSON解析阻塞了请求正文中的JSON内容。这是由express.bodyParser()处理的。可能会将您的请求内容发布给其他人进行检查。您可能还想暂时停止使用express.bodyParser(),以便通过查看原始请求正文更容易手动调试您的问题。我正在尝试使用类似的技术进行此修复,但我无法让'req.body.objectData返回错误以外的任何内容。你是否正在使用另一个模块,或者你知道为什么这个模块不起作用吗?这很有用。对我来说,在我点击提交后,我在页面上得到了JSON,但没有HTML。但是当我使用
stringify
时,我在AJAX中获得了成功函数的HTML和数据。谢谢你的解释。我不认为这会有帮助,但我尝试了一下,似乎没有达到预期的效果。你是如何使用saveTeams的?请求发布('/blabla',存储团队)?