Node.js nodejs-使用response.write和http.request时,第一个参数必须是字符串或缓冲区

Node.js nodejs-使用response.write和http.request时,第一个参数必须是字符串或缓冲区,node.js,http,callback,Node.js,Http,Callback,我只是尝试创建一个节点服务器,输出给定URL的HTTP状态 当我尝试用res.write刷新响应时,我得到了一个错误:throw new TypeError('第一个参数必须是字符串或缓冲区') 但是如果我用console.log替换它们,一切都很好(但我需要将它们写入浏览器而不是控制台) 代码是 var server = http.createServer(function (req, res) { res.writeHead(200, {"Content-Type": "text/p

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

当我尝试用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);

我想我应该在某个地方添加一个回调,但是非常混乱,非常感谢您的帮助。

响应。statusCode
是一个数字,例如
响应。statusCode==200
,而不是
'200'
。正如错误消息所说,
write
需要一个
string
Buffer
对象,因此必须对其进行转换

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

不过,您的回调注释也是正确的<代码>res.end()应该在回调中,就在
write
调用的下方。

很明显,您试图发送的东西不是字符串或缓冲区。:)它与控制台一起工作,因为控制台接受任何东西。简单的例子:

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails
将任何内容转换为字符串的一种方法是:

res.write( "" + obj );
无论什么时候你想要送东西。另一种方法是调用
.toString()
方法:

res.write( obj.toString( ) );
请注意,它可能仍然不是您要寻找的。您应该始终将字符串/缓冲区传递给
。编写
时不要使用此类技巧

作为旁注:我假设
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( );
});

请求采用回调方法,它是异步的!因此,我假设在执行回调时,
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
    })
});
现在它似乎可以正常工作,但没有错误信息…看起来像是bug

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

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

如果您想将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...);

第一个参数必须是string或Buffer类型的参数。接收类型对象

当我将身体数据传递给请求模块时,出现了上述错误

我传递了另一个参数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});})

是的,成功了。作为nodejs的新手,我不知道这一点,非常感谢。非常感谢你的回答和详细信息。是的,我已经把res.end移到了处理器中。我已经接受了@loganfsmyth,和之前一样。再次使用Thx。这样做了,还添加了。toString。多谢。我好像忘了。就这么做了。Thx.@umutm有更多的书面和详细的答案,你可能应该接受其中一个;使任何人都能看到这个问题。您的问题不同,默认情况下,body应该是字符串或缓冲区。您还可以将其更改为(json可序列化)并将json:true添加到选项中。例如:request.post({url:apiServerBaseUrl+'/v1/verify',body:{email:req.user.email},json:true})您可以使用它来避免字符串化
javascript请求
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});})