Странное поведение потока node.js/knox
Я работал над ответом на этот вопрос, расположенный здесь. Как сделать сокет потоком? Для подключения https ответ на S3 после imagemagick. В соответствии с рекомендацией loganfsmyth я прокомментировал строку req.end(изображение), однако, когда я пытаюсь загрузить файл, сервер просто отключается. Я испытываю подобное поведение, когда я раскомментирую строку req.end(изображение), за исключением того, что изображение успешно загружено на S3. Может ли кто-нибудь уточнить для меня, какой путь является правильным, также, если это правильно, чтобы раскомментировать строку req.end(изображение), каков наилучший способ отправить ответ в браузер, чтобы предотвратить его тайм-аут?
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
})
})
})
2 ответа
По сути, страница запрашивалась дважды, что приводило к перезаписи изображения из-за значка. Обновите страницу 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.
});