2

我做了一个调用 jQueryajax方法的 chrome 扩展:

内容脚本.js

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

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

网页.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...
  • 到处都变putpost
  • 改为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进行putting(或ing)时也会失败(参见上面的代码)。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)
4

3 回答 3

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

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

我认为你(和之前的几个响应者)在精神上挂断了这样一个事实,即 jQuery 的ajax方法使用键名“数据”作为请求正文中要发送的对象(序列化为 JSON),并神奇地滑向假设服务器端处理请求的任何东西也将通过“数据”的名称调用该对象。两者之间没有任何联系。

于 2012-05-21T08:13:01.817 回答
3

你必须使用req.body.data. 像这样的东西应该工作:

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

看看这个链接:bodyParser

我希望我能帮助你!:)

编辑:刚刚找到了一个很好的使用 $.ajax 的库,它被称为:superagent。你可以考虑试一试。看起来很有希望。:)

更新

问题在于您的 jquery 代码而不是 node.js 代码。您不能在对象的data属性中发送settings对象,您必须先将数据对象字符串化。您可以使用json2.js从令人敬畏的D 到 - ouglas Crockfordjson2.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('/');
});
于 2012-05-13T20:47:59.070 回答
0

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

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

于 2012-05-13T19:01:49.670 回答