我做了一个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)
答案 0 :(得分:6)
正如其他人提到的那样,你现在正在做,你需要使用bodyParser`中间件。
如果请求正文的内容类型为“application / json”,bodyParser
会将其解析为一个对象,该对象位于request.body
。因此,在您的情况下,request.body.name
应该是“随机对象”。
我认为你(以及之前的一些响应者)在精神上依赖于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”。