我只是想创建一个输出给定的URL的HTTP状态中的节点服务器。
当我尝试刷新与res.write的反应,我得到的错误:抛出新的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);
我相信我应该的地方,但很困惑添加一个回调和任何帮助表示赞赏。
Answer 1:
申请需要一个回调方法,它的异步! 所以我假设,由当时的回调执行res.end()
可能会被调用。 尝试关闭回调中的请求?
Answer 2:
response.statusCode
是一个数,例如response.statusCode === 200
,而不是'200'
由于错误消息说, write
需要一个string
或Buffer
对象,所以你必须将其转换。
res.write(response.statusCode.toString());
你也是你的回调意见正确,虽然。 res.end();
应该是回调中,仅低于你write
的电话。
Answer 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
}
});
Answer 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( );
});
Answer 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();
Answer 6:
还有另一种可能性(在此情况下)与AJAX(XMLHttpRequest的)工作时,同时将信息发送回你应该使用res.send(responseText的)客户端,而不是res.end(responseText的)
Answer 7:
虽然问题解决了,知识共享澄清错误的正确含义。
该错误表示,需要有关断功能的参数是不是在要求的格式,即字符串或缓冲区
解决的办法是改变参数字符串
breakingFunction(JSON.stringify(offendingParameter), ... other params...);
或缓冲
breakingFunction(BSON.serialize(offendingParameter), ... other params...);
文章来源: nodejs - first argument must be a string or Buffer - when using response.write with http.request