Подтвердить что ты не робот

Разница между 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".

Было бы здорово, если кто-то сможет объяснить мне различия.

4b9b3361

Ответ 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, чтобы он был быстрее в случае огромного количества данных.