Ответ 1
Запрос принимает метод обратного вызова, его асинхронный! Поэтому я предполагаю, что к тому времени, когда будет выполнен обратный вызов, может быть вызван res.end()
. Попробуйте закрыть запрос в обратном вызове.
Я просто пытаюсь создать сервер 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);
Я считаю, что я должен добавить обратный вызов где-нибудь, но довольно смущен, и любая помощь будет оценена.
Запрос принимает метод обратного вызова, его асинхронный! Поэтому я предполагаю, что к тому времени, когда будет выполнен обратный вызов, может быть вызван res.end()
. Попробуйте закрыть запрос в обратном вызове.
response.statusCode
представляет собой число, например. response.statusCode === 200
, а не '200'
. Как сказано в сообщении об ошибке, write
ожидает объект string
или Buffer
, поэтому вы должны его преобразовать.
res.write(response.statusCode.toString());
Вы также верны в своем комментарии к отзыву. res.end();
должен находиться внутри обратного вызова, чуть ниже ваших вызовов write
.
Я получаю это сообщение об ошибке, в котором упоминается 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
}
});
Ну, очевидно, вы пытаетесь отправить что-то, что не является строкой или буфером.:) Он работает с консолью, потому что консоль принимает что угодно. Простой пример:
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( );
});
если 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();
И есть другая возможность (не в этом случае) при работе с ajax (XMLhttpRequest), при отправке информации обратно клиентскому концу вы должны использовать res.send(responsetext) вместо res.end(responsetext)
Хотя вопрос решен, делимся знаниями для уточнения правильного значения ошибки.
Ошибка говорит о том, что параметр, необходимый для соответствующей функции прерывания, не имеет требуемого формата, т.е. строки или буфера
Решение состоит в том, чтобы изменить параметр на строку
breakingFunction(JSON.stringify(offendingParameter), ... other params...);
или буфер
breakingFunction(BSON.serialize(offendingParameter), ... other params...);