当使用response.write和http.request时,nodejs – 第一个参数必须是string或缓冲区
我只是试图创build一个节点服务器,输出给定的URL的HTTP状态。
当我尝试用res.write刷新响应时,出现错误:throw new TypeError('第一个参数必须是string或缓冲区');
但是,如果我用console.logreplace它们,一切都很好(但我需要将它们写入浏览器而不是控制台)。
代码是
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);
我相信我应该添加一个callback,但相当困惑,任何帮助表示赞赏。
请求采取callback方法,它的asynchronous! 所以我假设,在执行callback的时候res.end()
可能会被调用。 尝试在callback内closures请求?
response.statusCode
是一个数字,例如response.statusCode === 200
,不是'200'
。 如错误消息所示, write
期望一个string
或Buffer
对象,所以您必须将其转换。
res.write(response.statusCode.toString());
虽然你也callback评论是正确的。 res.end();
应该在callback之内,就在你的write
电话之下。
那么,显然你正在尝试发送一些不是string或缓冲区的东西。 :)它与控制台,因为控制台接受任何东西。 简单的例子:
var obj = { test : "test" }; console.log( obj ); // works res.write( obj ); // fails
一种将任何东西转换为string的方法是这样做的:
res.write( "" + obj );
每当你试图发送的东西。 另一种方法是调用.toString()
方法:
res.write( obj.toString( ) );
请注意,它可能不是你正在寻找的。 你应该总是将string/缓冲区传递给.write
而不用这些技巧。
作为一个方面说明:我假设这个request
是一个asynchronous操作。 如果是这种情况,那么res.end();
将在任何写入之前被调用,即任何写入都将失败(因为连接将在此时closures)。 将该行移到处理程序中:
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( ); });
我得到这个错误信息,它提到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 }) }
它似乎现在没有错误信息工作…似乎像错误虽然
如果你想写一个JSON对象到响应那么改变头文件的内容types为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();