响应没有结束,浏览器继续加载 - nodejs和graphicsmagick

时间:2014-07-15 16:13:23

标签: node.js imagemagick graphicsmagick

我是nodejs的新手。我使用graphicsmagick调整图像大小,然后再将其发送到浏览器。 我的代码看起来像这样(res是从函数发送的响应(req,res){...}) -

imageURLPromise
.then(function(response) {
    var  body = response.body;
    if (body) {
    console.log("Found From: " + response.request.uri.href);

    //set response headers here
    setResponseData(res, response);


    var buf = new Buffer(body, "binary");
    console.log(buf);
    //gm module
    gm(buf).resize(400,300).toBuffer(function(err,buffer) {
        console.log("buffer here");
        res.end(buffer, "binary");
    });
    }
}, function(error) {
      console.log(error);
});

我在浏览器中获取图像,我在这里得到日志“缓冲区”,但浏览器仍处于“加载”状态。

我尝试将.stream()与gm一起使用并将stdout传递给响应,但它有同样的问题。

如果我取消gm并直接将主体写入响应,就像这样

res.end(body, 'binary');

然后它正常工作。

有人可以告诉我这里做错了吗?

1 个答案:

答案 0 :(得分:2)

我弄明白了这个问题。 问题不在于node或gm,而在于HTTP响应头。

当GM返回缓冲区并将其写入HTTP响应时,它会将Transfer-Encoding标头设置为“chunked”。在这种情况下,永远不应该设置Content-Length标头。 你可以在这里读更多关于它的内容 http://en.wikipedia.org/wiki/Chunked_transfer_encoding

因为我设置了浏览器,即使在发送图像后,浏览器仍在等待内容。

代码与我发布的完全相同,除了在setResponseData()函数(基本上用于设置标题)中我没有设置内容长度标题。