我该如何从浏览器向一个Node脚本发送数据?

3
在页面加载时,我在脚本标签中运行了以下JavaScript代码:
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://lvh.me:1337", true);
xhttp.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
xhttp.send(JSON.stringify({hello:"goodbye"}));

那么节点脚本的代码就是:

var http = require('http');
http.createServer(function (request, response) {
    response.writeHead(200, {
        'Content-Type': 'text/plain',
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"
    });
    console.log(request);
    response.end("");
}).listen(1337);

但是在console.log中,我没有看到{"hello":"goodbye"}对象。我如何访问这个对象?


它说它是未定义的。 - Nick Manning
1
request 对象是一个流(stream),因此我认为您需要处理 data 事件。 - MinusFour
我该如何做到这一点,@MinusFour? - Nick Manning
1个回答

5
createServer 文档 告诉我们,您提供的回调函数将由 request 事件触发。 request 事件文档 告诉我们,request(第一个参数)是一个 http.IncomingMessage 对象。它没有 body 属性,但它实现了 ReadableStream 接口,您可以监听 'data' 事件来获取数据:
// ES2015 (all of the below is supported in current NodeJS)
let body = '';
request.on('data', chunk => body += chunk);
request.on('end', () => console.log(JSON.parse(body)));

或者

// ES5
var body = '';
request.on('data', function (chunk) {
   body += chunk;
});
request.on('end', function(){
  console.log(JSON.parse(body));
});

现在有很多 HTTP 服务器的实现可以为你抽象出这个过程,并提供一个 request.body 来使用。 body-parser 是一个很好的例子,甚至会帮你解析 JSON。


你完全正确...典型的body-parser中间件...! - charliebrownie
非常感谢,你肯定有所发现。我仍然遇到麻烦。现在我得到了 SyntaxError: Unexpected end of input。当我注释掉 console.log(JSON.parse(body)); 时,它就消失了。 - Nick Manning
1
@NickManning 看起来 body 不是有效的 JSON。尝试使用 console.log(body) - Explosion Pills
@ExplosionPills---这样做会输出[object Object] - Nick Manning
没事了,抱歉。我忘记在研究时从我的HTML文件中去掉了“JSON.stringify”。谢谢@ExplosionPills和TJ Crowder。 - Nick Manning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接