Разница между response.send и response.write в node js
Я написал небольшой API, который использует фреймворк Node js "restify". Этот API получает запрос (фактически что-нибудь после "/" ), а затем отправляет этот запрос другому серверу. Получите ответ от сервера и передайте ответ обратно в исходный источник запроса. Для этого API я использую как восстанавливать сервер, так и клиент.
Ниже приведен код API для лучшего понимания.
var apiServer = require('apiServer');
apiServer.start();
var restify = require('restify');
var assert = require('assert');
function onRequest(request, response, next)
{
var client = restify.createStringClient({
url: 'http://example.com'
});
client.get('/' + request.params[0], function(err, req, res, data) {
assert.ifError(err);
response.setHeader('Content-Type', 'text/html');
response.writeHead(res.statusCode);
response.write(data);
response.end();
});
next();
}
function start()
{
var server = restify.createServer();
server.get(/^\/(.*)/, onRequest);
server.listen(8888);
console.log("Server has started.");
}
exports.start = start;
Теперь мне нужно знать разницу между response.write
и response.send
от Node.js. Потому что с помощью response.write
я могу установить заголовок и написать в нем, но при использовании response.send
ничего не могу сделать с заголовками. Когда я использую response.send
с setHeader()
или writeHeader()
, я получаю эту ошибку:
http.js:691
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
Есть и другое. С response.send()
я получаю полный вывод HTML на экране, например:
<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"
Но с response.write
я не получаю html на экране, а только текст "bla bla bla"
.
Было бы здорово, если кто-то сможет объяснить мне различия.
Ответы
Ответ 1
Я не могу найти response.send()
в docs, но я предполагаю, что .send()
заполнит и отправит ответ, так что только вызывать один раз, тогда как .write()
будет просто писать ответ, но вы должны отправить его с помощью response.end()
Это означает, что вы можете редактировать заголовки с помощью .write()
, потому что ответ еще не отправлен.
ИЗМЕНИТЬ:
response.send()
является частью обновить оболочку API отклика
Ответ 2
response.send(msg)
равно response.write(msg);response.end();
Это означает, что send
можно вызывать только один раз, write
можно вызывать много раз, но вы должны сами вызвать end
.
Ответ 3
res.send()
является частью Express.js вместо чистого Node.js.
Просто боковое наблюдение. Мое приложение иногда отправляет обратно очень большой объект Json ( HighChart, который содержит более 100 тыс. Точек). С res.send()
иногда он зависает и задыхается от сервера, тогда как res.write()
и res.end()
обрабатывают его просто отлично.
Я также заметил всплеск памяти при вызове res.send()
.
Ответ 4
Я пытался отправить огромные текстовые данные (295mb) по http с помощью res.send(data) и res.write(data). Я заметил, что res.send(data) медленнее, чем res.write(data). Я заметил следующие вещи.
res.send(data): он может быть вызван только один раз, и он отправляет данные в кусок некоторого размера буфера клиенту, а затем снова возвращается и отправляет другой кусок размера буфера, поэтому есть много назад и вперед http-связи.
res.write(data): Он может быть вызван несколько раз, за которым следует res.end(), и создает размер буфера на основе целых данных и отправляет по http, чтобы он был быстрее в случае огромного количества данных.