当使用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期望一个stringBuffer对象,所以您必须将其转换。

 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();