nodejs - 第一个参数必须是字符串或缓冲区 - 当使用带有http.request的response.write时

时间:2013-02-12 15:09:13

标签: node.js http callback

我只是想创建一个输出给定URL的HTTP状态的节点服务器。

当我尝试使用res.write刷新响应时,我收到错误:throw new TypeError('first argument必须是字符串或Buffer');

但如果我用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);

我相信我应该在某处添加一个回调,但非常困惑,任何帮助都会受到赞赏。

8 个答案:

答案 0 :(得分:49)

response.statusCode是一个数字,例如response.statusCode === 200,而不是'200'。如错误消息所示,write需要stringBuffer对象,因此您必须转换它。

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

虽然您对回调评论也是正确的。 res.end();应位于回调中,就在write来电之下。

答案 1 :(得分:39)

我收到此错误消息,它提到了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
    })
});

现在看起来没有错误信息就行了......虽然看起来像是bug。

我认为这是更正式的方式:

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

答案 2 :(得分:22)

请求采用回调方法,其异步!所以我假设,在执行回调时,可能会调用res.end()。尝试在回调中关闭请求?!

答案 3 :(得分:13)

嗯,显然你正在尝试发送不是字符串或缓冲区的东西。 :)它适用于控制台,因为控制台接受任何东西。简单的例子:

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

答案 4 :(得分:1)

如果你想将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();

答案 5 :(得分:1)

当使用ajax(XMLhttpRequest)时,还有另一种可能性(不是在这种情况下),同时将信息发送回客户端,你应该使用 res.send(responsetext)而不是res。端(responseText的)

答案 6 :(得分:1)

  

虽然问题已经解决,但需要分享知识以澄清错误的正确含义。

错误表示相关中断函数所需的参数不是所需的格式,即字符串或缓冲区

解决方案是将参数更改为字符串

InterfaceBuilder

或缓冲区

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

答案 7 :(得分:0)

第一个参数必须是字符串或缓冲区类型之一。收到类型对象

 at write_

我在将正文数据传递到请求模块时遇到了以上错误。

我传递了另一个参数JSON:true及其有效。

var option={
url:"https://myfirstwebsite/v1/appdata",
json:true,
body:{name:'xyz',age:30},
headers://my credential
}
rp(option)
.then((res)=>{
res.send({response:res});})
.catch((error)=>{
res.send({response:error});})