奇怪的流行为node.js / knox

最后发布: 2013-03-31 22:17:58


问题

我一直在努力解决这里的问题, 如何使套接字成为流? 在imagemagick之后将https响应连接到S3 根据loganfsmyth的建议,我评论了req.end(image)行,但是,当我尝试上传文件时,服务器只是超时。 当取消注释req.end(image)行时,我会遇到类似的行为,但该图像已成功上传到S3。 如果取消对req.end(image)行的注释正确,有人可以为我澄清哪种方法也是正确的,向浏览器发送响应以防止其超时的最佳方法是什么?

https.get(JSON.parse(queryResponse).data.url,function(res){

  graphicsmagick(res)
    .resize('50','50')
    .stream(function (err, stdout, stderr) {

      ws. = fs.createWriteStream(output)

      i = []

      stdout.on('data',function(data){
        i.push(data)
      })

      stdout.on('close',function(){
        var image = Buffer.concat(i)

        var req = S3Client.put("new-file-name",{
           'Content-Length' : image.length
          ,'Content-Type' : res.headers['content-type']
        })

        req.on('response',function(res){  //prepare 'response' callback from S3
          if (200 == res.statusCode)
            console.log('it worked')
        })
        //req.end(image)  //send the content of the file and an end
      })
  })
})
node.js amazon-web-services amazon-s3 imagemagick knox-amazon-s3-client
回答

基本上,该页面被请求两次,这导致图像由于收藏夹图标而被覆盖。 node.js页面两次刷新调用资源?


回答

在您链接到的问题中,用户使用的是putStream ,因此调用req.end()是不正确的,但是在您的情况下,您直接使用put ,因此您需要调用req.end() 否则将其注释掉,除了长度,您实际上不会使用image值,因此,您永远不会发送图像数据。

很难看到没有真正运行此代码的服务器处理程序,但是您需要(可选)返回一些响应,然后再.end()返回与浏览器的实际连接,否则它将等待。

所以如果你有这样的事情

http.createServer(function(req, browserResponse){

  // Other code.

  req.on('response',function(s3res){  //prepare 'response' callback from S3
      if (200 == s3res.statusCode) console.log('it worked')


      // Close the response. You also pass it data to send to the browser.
      browserResponse.end();
  })

  // Other code.
});