的NodeJS - 第一个参数必须是一个字符串或缓冲区 - 使用的Response.Write与h

2019-07-19 19:14发布

我只是想创建一个输出给定的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需要一个stringBuffer对象,所以你必须将其转换。

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