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

Nodejs - первый аргумент должен быть строкой или буфером - при использовании response.write с http.request

Я просто пытаюсь создать сервер node, который выводит статус HTTP данного URL-адреса.

Когда я пытаюсь очистить ответ с помощью res.write, я получаю сообщение об ошибке: throw new TypeError ( "первый аргумент должен быть строкой или буфером" );

Но если я заменю их на console.log, все будет хорошо (но мне нужно записать их в браузер, а не в консоль).

Код

var server = http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/plain"});

    request({
        uri: 'http://www.google.com',
        method: 'GET',
        maxRedirects:3
    }, function(error, response, body) {
        if (!error) {
            res.write(response.statusCode);
        } else {
            //response.end(error);
            res.write(error);
        }
    });     

    res.end();
});
server.listen(9999);

Я считаю, что я должен добавить обратный вызов где-нибудь, но довольно смущен, и любая помощь будет оценена.

4b9b3361

Ответ 1

Запрос принимает метод обратного вызова, его асинхронный! Поэтому я предполагаю, что к тому времени, когда будет выполнен обратный вызов, может быть вызван res.end(). Попробуйте закрыть запрос в обратном вызове.

Ответ 2

response.statusCode представляет собой число, например. response.statusCode === 200, а не '200'. Как сказано в сообщении об ошибке, write ожидает объект string или Buffer, поэтому вы должны его преобразовать.

res.write(response.statusCode.toString());

Вы также верны в своем комментарии к отзыву. res.end(); должен находиться внутри обратного вызова, чуть ниже ваших вызовов write.

Ответ 3

Я получаю это сообщение об ошибке, в котором упоминается options.body

У меня было это изначально

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: {
        email: req.user.email
    }
});

Я изменил это на:

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: JSON.stringify({
        email: req.user.email
    })
});

и кажется, что теперь работает без сообщения об ошибке... похоже, ошибка.

Я думаю, что это более официальный способ сделать это:

 request.post({
        url: apiServerBaseUrl + '/v1/verify',
        json: true,
        body: {
            email: req.user.email
        }
    });

Ответ 4

Ну, очевидно, вы пытаетесь отправить что-то, что не является строкой или буфером.:) Он работает с консолью, потому что консоль принимает что угодно. Простой пример:

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails

Один способ конвертировать что-либо в строку - это:

res.write( "" + obj );

всякий раз, когда вы пытаетесь отправить что-то. Другой способ - вызвать метод .toString():

res.write( obj.toString( ) );

Обратите внимание, что это все еще может не быть тем, что вы ищете. Вы всегда должны передавать строки/буферы на .write без таких трюков.

В качестве побочного примечания: Я предполагаю, что request является асинхронной операцией. Если это произойдет, то res.end(); будет вызываться перед любой записью, т.е. Любая запись в любом случае потерпит неудачу (потому что соединение будет закрыто в этой точке). Переместите эту строку в обработчик:

request({
    uri: 'http://www.google.com',
    method: 'GET',
    maxRedirects:3
}, function(error, response, body) {
    if (!error) {
        res.write(response.statusCode);
    } else {
        //response.end(error);
        res.write(error);
    }
    res.end( );
});

Ответ 5

если u хочет записать объект JSON в ответ, измените тип содержимого заголовка на application/json

response.writeHead(200, {"Content-Type": "application/json"});
var d = new Date(parseURL.query.iso);
var postData = {
    "hour" : d.getHours(),
    "minute" : d.getMinutes(),
    "second" : d.getSeconds()
}
response.write(postData)
response.end();

Ответ 6

И есть другая возможность (не в этом случае) при работе с ajax (XMLhttpRequest), при отправке информации обратно клиентскому концу вы должны использовать res.send(responsetext) вместо res.end(responsetext)

Ответ 7

  Хотя вопрос решен, делимся знаниями для уточнения правильного значения ошибки.

Ошибка говорит о том, что параметр, необходимый для соответствующей функции прерывания, не имеет требуемого формата, т.е. строки или буфера

Решение состоит в том, чтобы изменить параметр на строку

breakingFunction(JSON.stringify(offendingParameter), ... other params...);

или буфер

breakingFunction(BSON.serialize(offendingParameter), ... other params...);