Javascript 我的代码片段有什么不同?(Node.js新手)

Javascript 我的代码片段有什么不同?(Node.js新手),javascript,node.js,express,Javascript,Node.js,Express,我正在尝试使用以下node.js代码从远程站点(URL)返回 案例1:使用基本HTTP模块+请求模块 var http = require('http'); var fs = require('fs'); var request = require('request'); var server = http.createServer(function(req, res) { // Can't get back any response from remote URL // Can't use '

我正在尝试使用以下node.js代码从远程站点(URL)返回

案例1:使用基本HTTP模块+请求模块

var http = require('http');
var fs = require('fs');
var request = require('request');
var server = http.createServer(function(req, res) {
// Can't get back any response from remote URL
// Can't use 'res' or nothing have in res
request('http://remote.foo.com/app/lists/dosomething.json', 
    function(err, response, body) {
        console.log(body);
    }
);

var host = 'http://remote.foo.com';
var app = '/app/lists/dosomething.json?';
var url = 'param1=a&param2=b';

// I can get something to print out back
request.get(host+app+url).pipe(res);
});`
var express = require('express')
, http = require('http')
, path = require('path')
, net = require('net')
, url = require('url')
, qs = require('qs');

var request = require('request');
    //.....
app.get('/test/foo.json', function(req, res) {
    var url_parts = url.parse(req.url, true);
    var query = qs.parse(url_parts.query);

    var host = 'http://remote.foo.com';
    var app = '/path/dosomething.json?';
    var url = 'param1=a&param2=b';

    //the following line, the same code above Case 1 
    //can't get any result, just blank..
    request.get(host+app+url).pipe(res);
    res.end();
});
//....
案例2:使用Express+请求模块

var http = require('http');
var fs = require('fs');
var request = require('request');
var server = http.createServer(function(req, res) {
// Can't get back any response from remote URL
// Can't use 'res' or nothing have in res
request('http://remote.foo.com/app/lists/dosomething.json', 
    function(err, response, body) {
        console.log(body);
    }
);

var host = 'http://remote.foo.com';
var app = '/app/lists/dosomething.json?';
var url = 'param1=a&param2=b';

// I can get something to print out back
request.get(host+app+url).pipe(res);
});`
var express = require('express')
, http = require('http')
, path = require('path')
, net = require('net')
, url = require('url')
, qs = require('qs');

var request = require('request');
    //.....
app.get('/test/foo.json', function(req, res) {
    var url_parts = url.parse(req.url, true);
    var query = qs.parse(url_parts.query);

    var host = 'http://remote.foo.com';
    var app = '/path/dosomething.json?';
    var url = 'param1=a&param2=b';

    //the following line, the same code above Case 1 
    //can't get any result, just blank..
    request.get(host+app+url).pipe(res);
    res.end();
});
//....
有人能解释一下吗


谢谢

对我的评论进行一点扩展:

当您
pipe()
将可读流转换为可写流时,默认情况下,当可读流发出
end
事件时,将调用
writable.end()。这意味着,在管道流时,不必自己显式关闭目标流:当源关闭时,目标流将自动关闭。这应该是有意义的:当源流结束时,目标流没有任何事情要做,并且应该确实关闭

在第二个示例中,您首先将可读流(
request
)导入可写流(
res
),但下一条指令关闭
res
流,甚至不读取任何内容,因为第一个
read()
调用在下一个勾号上执行(请参阅)。解决方案是删除
res.end()
,因为它将自动处理


作为旁注:如果出于某种原因需要保持目标流的打开状态,可以将
{end:false}
传递到
管道

,在第二个示例中,为什么要结束响应?当另一条流通过管道进入时,您无需手动关闭该流。@PaulMougel,非常感谢!它起作用了!我习惯性地添加了它(res.end()),从未想过这可能是原因。新年快乐。再次非常感谢你。