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

umu*_*utm 82 http callback node.js

我只是想创建一个输出给定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);
Run Code Online (Sandbox Code Playgroud)

我相信我应该在某个地方添加一个回调,但很困惑,任何帮助都表示赞赏.

log*_*yth 50

response.statusCode是一个数字,例如response.statusCode === 200,不是'200'.正如错误消息所示,write期望一个string或一个Buffer对象,所以你必须转换它.

res.write(response.statusCode.toString());
Run Code Online (Sandbox Code Playgroud)

你对回调评论也是正确的.res.end();应该在回调中,就在您的write通话之下.


Ale*_*lls 45

我收到此错误消息,它提到options.body

我最初有这个

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: {
        email: req.user.email
    }
});
Run Code Online (Sandbox Code Playgroud)

我改成了这个:

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: JSON.stringify({
        email: req.user.email
    })
});
Run Code Online (Sandbox Code Playgroud)

它现在似乎没有错误消息...但似乎像bug.

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

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

  • 你的问题不同,默认情况下身体是一个字符串或缓冲区.你也可以改变它(以json序列化)将json:true添加到选项中.例如:request.post({url:apiServerBaseUrl +'/ v1/verify',body:{email:req.user.email},json:true}) (4认同)
  • 您可以使用它来避免**stringify**```javascript request.post({url:apiServerBaseUrl +'/ v1/verify',json:{email:req.user.email}}``` (2认同)

Gau*_*wal 27

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

  • @umutm 有更多写得很好和详尽的答案,您可能应该接受其中之一;使其对任何提出此问题的人可见。 (2认同)

fre*_*ish 13

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

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails
Run Code Online (Sandbox Code Playgroud)

将任何东西转换为字符串的一种方法是:

res.write( "" + obj );
Run Code Online (Sandbox Code Playgroud)

无论何时你想发送东西.另一种方法是调用.toString()方法:

res.write( obj.toString( ) );
Run Code Online (Sandbox Code Playgroud)

请注意,它仍然可能不是您要找的.你应该总是在.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( );
});
Run Code Online (Sandbox Code Playgroud)