如何在服务器端(node.js)检索我在jQuery.ajax()的`data`属性中传递的对象?

时间:2012-05-13 18:58:43

标签: node.js jquery express

我做了一个chrome扩展,它调用了jQuery的ajax方法:

内容-的script.js

[...]
$.ajax({
    "url": "http://localhost:5000/",
    "type": "PUT",
    "contentType": "application/json",
    "data": { "name": "random object" },
    "dataType": "json"
});
[...]

在服务器端,我正在尝试获取data属性中传递的信息:

web.js

[...]
app.put('/', function(request, response) {
    console.log(request.data);
});
[...]

但我得到的是undefined。如何在data属性中传递的对象应该在服务器端检索(Node.js + express.js)?

我也尝试了console.log(request)并且在那里得到了很多东西,但看起来像我在data属性中传递的信息......

修改

我的最新尝试(基于graydsl的回答)对上面的代码进行了以下更改:

  • app.use(express.bodyParser());之前添加app.put...
  • put更改为post无处不在
  • request.data更改为request.body.data

现在,代码在响应这样的表单时执行了我想要的操作:

<form method="post" action="/">
    <input name="data" type="text" value="WOO HA" />
    <input type="submit" name="submit" value="submit" />
</form>

但是,如果我恢复使用post而不是put(并且浏览器由于某种原因导致http://localhost:5000/?data=WOO+HA&submit=submit结束),它仍会失败。

当使用ajax put(或post)时,它也会失败(参见上面的代码)。当我用ajax尝试它时,我在服务器上得到它:

SyntaxError: Unexpected token ILLEGAL
    at Object.parse (native)
    at IncomingMessage.<anonymous> (/home/shawn/.node_libraries/.npm/connect/1.8.7/package/lib/middleware/bodyParser.js:135:16)
    at IncomingMessage.emit (events.js:61:17)
    at HTTPParser.onMessageComplete (http.js:133:23)
    at Socket.ondata (http.js:1019:22)
    at Socket._onReadable (net.js:683:27)
    at IOWatcher.onReadable [as callback] (net.js:177:10)

3 个答案:

答案 0 :(得分:6)

  1. 正如其他人提到的那样,你现在正在做,你需要使用bodyParser`中间件。

  2. 如果请求正文的内容类型为“application / json”,bodyParser会将其解析为一个对象,该对象位于request.body。因此,在您的情况下,request.body.name应该是“随机对象”。

  3. 我认为你(以及之前的一些响应者)在精神上依赖于jQuery的ajax方法在请求中使用密钥名称“data”来发送(序列化为JSON)的对象身体,并且神奇地滑动到假设处理请求的服务器端的任何内容也将通过名称“data”调用该对象。这两者之间没有联系。

答案 1 :(得分:3)

您必须使用req.body.data。这样的事情应该有效:

app.post('/', function(req, res) {
  console.log(req.body.data);
  res.redirect('/');
});

请看一下这个链接:bodyParser

我希望我能帮到你! :)

编辑:刚刚找到一个很好的lib来处理$ .ajax,它叫做superagent。你可以考虑尝试一下。看起来很有希:)

更新

问题在于你的jquery代码不在node.js代码中。您无法在data对象的settings属性中发送对象,您必须首先 stringify 数据对象。你可以使用来自真棒 D的json2.js - 到 - ouglas Crockford json2.js

包含该库后,以下代码应该为您提供所需的结果:

$().ready(function() {

    var data = {
        data: "My name is",
        name: "Slim Shady"
    };

    stringifiedData = JSON.stringify(data);

    $.ajax({
        "url": "http://127.0.0.1:3000/",
        "type": "PUT",
        "contentType": "application/json",
        "data": stringifiedData,
        "dataType": "json"
    });
});

在app.js中:

app.put('/', function(req, res) {
    console.log(req.body.data + "... " + req.body.name);
    res.redirect('/');
});

答案 2 :(得分:0)

jquery数据属性在发送到服务器之前会被转换为查询字符串或发布数据。要检索它,请使用node.js解码GET和POST参数。

你说你使用express.js。在express.js中,如果你这样传递data{ EmployeeName : "George" }那么,在express.js中,request.params.EmployeeName将包含“George”。