2015-09-07 7 views
2

У меня возник вопрос о ходе отправки с помощью запроса Node.js. У меня есть приложение Node.js, которое действует как прокси-сервер, фактически перенаправляя тело другому серверу. Я хочу видеть ход этого действия по загрузке. Теперь я делаю это:Node.js индикатор индикатора прогресса

BROWSER 
    -> UPLOAD TO NODE 
    -> UPLOAD TO 3rd PARTY SERVICE 
    -> RETURN 3rd PARTY RESPONSE TO BROWSER 

Если это возможно, я хотел бы зарегистрировать ее, чтобы проверить в console.log сколько прогресс делается. Но, было бы также возможно вернуть

res.send(progress) 

в то же время, во время ожидания загрузки, чтобы закончить и отправить клиенту обратно загрузка удалось?

BROWSER 
    -> UPLOAD TO NODE 
    -> UPLOAD TO 3rd PARTY SERVICE 
     -> RETURN progress <- 
     -> RETURN progress <- 
     ...etc. 
    -> RETURN 3rd PARTY RESPONSE TO BROWSER 

Это код загрузки (довольно простой).

var requestOptions = { 
    timeout: 120000, 
    url: url, //URL to hit 
    method: 'post', 
    headers: headers, 
    body: payload //Set the body as a string 
}; 


request(requestOptions, function (error, response, body) { 
    if (error) { 
     res.send(error); 
    } 
    else { 
     //res.sendStatus(response.statusCode); 
     console.log("[RETURNING RESPONSE BODY]"); 
     res.send(body); 
    } 
}); 
+0

использование 'res.write()' для отправки обновлений по запросу. Когда загрузка завершена, используйте 'res.end()' – AdityaParab

ответ

4

Ваш вопрос содержит две части. Один из них - для получения прогресса от запроса, который можно найти здесь: Upload Progress — Request

Другая часть будет уведомлять обозревателя о ходе выполнения. Протокол HTTP не позволяет отправлять несколько ответов, поэтому использование res.send(progress) невозможно.

Однако вы можете продолжать отправлять частичные ответы до тех пор, пока они не закончатся. Дать что-то Рез, не закрывая это так просто, как res.write("string"), но доступ ответ может быть сложнее: Accessing partial response using AJAX or WebSockets?

Вы также нужен способ, чтобы обернуть тело (а также ошибки) с сервера подложки, так что он может поместиться в окончательный частичный ответ.

Другим решением будет открытие другого запроса WebSocket для отслеживания процесса загрузки/загрузки. socket.io - хорошая библиотека для узла для этой цели.

+0

Спасибо. Первая ссылка привела меня к решению для первой части. Поэтому мне нужно увидеть это как две части, что имеет смысл. Я загляну в socket.io. –

+0

Это намного лучше, чем остальное, но отсутствует контент, относящийся к ответу из ссылок. – dewwwald

1

Раствор для первой части была в r.req.connectin.bytesWritten

var r = request(requestOptions, function (error, response, body) { 
    clearInterval(q); 

    ... 
}); 

var q = setInterval(function() { 
     console.log("Uploaded: " + r.req.connection.bytesWritten); 
     }, 250); 
+0

Хотя логика, которую вы реализуете, правильная, это неправильный ответ, потому что вы 'console.log'у это на сервере. Оператор хочет его в браузере. :) – AdityaParab

+0

Ах, пока я был OP, вы несколько верны. Но я заявляю, что это будет решением первой части моего вопроса. Правильно ли я это делаю? :) –

+1

Да ладно, @Riel - это ОП. И я уверен, что он или она улучшит ответ, найдя правильный способ сделать отчеты о ходе работы с сервером. ;-) – FelisCatus

Смежные вопросы