管理图像与发送带有请求的node.js中的回调体

时间:2014-12-15 14:20:56

标签: javascript node.js http request node-request

我使用node.js 0.10.33并请求2.51.0。

在下面的示例中,我构建了一个使用请求代理图像的简单Web服务器。设置了两条路线来代理同一图像..

/ pipe 只是将原始请求传递给响应

/ callback 等待请求回调,并将响应标头和正文发送给响应。

管道示例按预期工作,但回调路径不会呈现图像。标题和正文看起来是一样的。

回调路线会导致图像中断?

以下是示例代码:

var http    = require('http');
var request = require('request');

var imgUrl = 'https://developer.salesforce.com/forums/profilephoto/729F00000005O41/T';

var server = http.createServer(function(req, res) {

  if(req.url === '/pipe') {
    // normal pipe works
    request.get(imgUrl).pipe(res);
  } else if(req.url === '/callback') {
    // callback example doesn't
    request.get(imgUrl, function(err, resp, body) {
      if(err) {
        throw(err);
      } else {
        res.writeHead(200, resp.headers);
        res.end(body);
      }
    });
  } else {
    res.writeHead(200, {
      'Content-Type': 'text/html'
    });

    res.write('<html><head></head><body>');

    // test the piped image
    res.write('<div><h2>Piped</h2><img src="/pipe" /></div>');

    // test the image from the callback
    res.write('<div><h2>Callback</h2><img src="/callback" /></div>');

    res.write('</body></html>');
    res.end();
  }
});

server.listen(3000);

结果

Test Result

1 个答案:

答案 0 :(得分:3)

问题是默认情况下body是一个(UTF-8)字符串。如果您期望二进制数据,则应在encoding: null选项中明确设置request()。这样做会使body成为缓冲区,二进制数据保持不变:

request.get(imgUrl, { encoding: null }, function(err, resp, body) {
  if(err) {
    throw(err);
  } else {
    res.writeHead(200, resp.headers);
    res.end(body);
  }
});