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

Posted

技术标签:

【中文标题】nodejs express, ajax 发布 w/jquery 并接收响应【英文标题】:nodejs express, ajax posting w/ jquery and receiving response 【发布时间】:2011-09-11 11:15:15 【问题描述】:

在快速响应我的 jquery ajax 请求时遇到一些麻烦。实际发布工作正常,但无论我尝试什么,我似乎都无法从我的应用程序中获得可以使用的数据响应。起初它只是不断地发布和挂起,大约一分钟后它会回复一个警报,上面写着“XML 文档已加载”(不知道它来自哪里)——不管怎样,现在它给了我

SyntaxError: Unexpected token ILLEGAL 解析时(本机) 在传入消息。

在我的快递应用中,我有:

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

【问题讨论】:

node 标签不适用于 node.js 能否打开chrome调试器检查器查看请求正文的JSON内容?您看到的错误是服务器端 JSON 解析阻塞请求正文中的 JSON 内容。这由 express.bodyParser() 处理。也许发布您的请求内容供人们检查。您可能还想暂时停止使用 express.bodyParser(),以便更容易手动调试您的问题,查看原始请求正文。 我正在尝试使用此修复的类似技术,但我无法让 'req.body.objectData 返回任何内容,但只能返回错误。您是否正在使用其他模块或知道为什么这不起作用? 【参考方案1】:

您发送的不是有效的 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() 为我们完成了这项工作。

【讨论】:

这很有用。对我来说,单击提交后,我在页面上得到了 JSON,但没有 html。但是当我使用stringify 时,我在 AJAX 中将 HTML 和数据传给了我的成功函数。谢谢你的解释。我不认为这会有所帮助,但我尝试了一下,似乎得到了预期的结果。【参考方案2】:

由于您使用的是快递,

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(是的,看起来像一个循环,但一切正常)。

【讨论】:

【参考方案3】:

Pastor 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 标头与解析工作相关。

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

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? req.post('/blabla', saveTeams) ?

以上是关于nodejs express, ajax 发布 w/jquery 并接收响应的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS w/Express 错误:无法获取 /

图像上传失败 w/nodejs express

为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?

如何捕捉这个错误 NodeJs/Express?

用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

phonegap ajax 用户身份验证与 nodejs-express-mongodb-passport js