如何在NodeJS中发送请求对象

时间:2014-05-29 23:45:05

标签: node.js

我想做这样的事情,但这是一个错误,我似乎也无法使用JSON.stringify。有没有办法做到这一点?

var http = require('http')
http.createServer(function(req, res) {
    res.end(req);
}).listen(3000);

1 个答案:

答案 0 :(得分:4)

从简单的事情开始:

var http = require('http');
http.createServer(function(req, res) {
    res.write(req.url);
    res.end();
}).listen(3000);

如果您想回显请求,您需要考虑它的哪些部分。 HTTP请求有一个标题和正文。调用处理程序函数时,标头已经可用,但正文是您需要按块读取块的流,然后您可以决定直接将其流式传输,解析,转换或其他任何内容。有很多例子可以开始。

这是一个管道版本。

var http = require('http');
http.createServer(function(req, res) {
    req.pipe(res);
}).listen(3000);

我测试它是这样的:

curl -X POST -d 'foo=bar' localhost:3000/hello/foo
foo=bar%

这个版本给了我一些有效的输出,因为它不是JSON格式。如您所见,req对象有大量内部状态与服务器端编程有关,这与传入HTTP请求的内容无关。因此,获取请求DATA不是正确的方法,这与req对象编程接口不同。

var util = require('util');
var http = require('http');
http.createServer(function(req, res) {
    res.write(util.inspect(req));
    res.end();
}).listen(3000);

{ _readableState: 
   { highWaterMark: 16384,
     buffer: [],
     length: 0,
     pipes: null,
     pipesCount: 0,
....etc

这是一个将请求标头作为JSON发送回来的版本:

var http = require('http');
http.createServer(function(req, res) {
    res.setHeader('Content-Type', 'application/json');
    res.write(JSON.stringify(req.headers));
    res.end();
}).listen(3000);

回复:

curl -v  localhost:3000
* Adding handle: conn: 0x7fd983804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fd983804000) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 3000 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Fri, 30 May 2014 00:10:02 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"user-agent":"curl/7.30.0","host":"localhost:3000","accept":"*/*"}%