105

指定された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);

どこかにコールバックを追加する必要があると思いますが、かなり混乱しているので、助けていただければ幸いです。

4

8 に答える 8

54

response.statusCodeは数値です。たとえばresponse.statusCode === 200、ではありません'200'。エラーメッセージにあるようにwritestringまたはBufferオブジェクトが必要なので、変換する必要があります。

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

ただし、コールバックコメントについても正しいです。res.end();コールバック内、通話のすぐ下にある必要がありますwrite

于 2013-02-12T15:19:21.543 に答える
54

このエラーメッセージが表示され、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
        }
    });
于 2015-12-20T07:34:23.570 に答える
33

リクエストはコールバックメソッド、その非同期を取ります!したがって、コールバックが実行されるまでに、res.end()が呼び出される可能性があると想定しています。コールバック内でリクエストを閉じてみてください。

于 2013-02-12T15:20:46.490 に答える
14

まあ、明らかにあなたは文字列やバッファではない何かを送信しようとしています。:)コンソールは何でも受け入れるので、コンソールで動作します。簡単な例:

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails

何かを文字列に変換する1つの方法は、次のことです。

res.write( "" + obj );

あなたが何かを送ろうとしているときはいつでも。.toString()もう1つの方法は、メソッドを呼び出すことです。

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( );
});
于 2013-02-12T15:20:09.753 に答える
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();
于 2017-04-26T04:38:34.510 に答える
1

また、ajax(XMLhttpRequest)を使用する場合は、別の可能性があります。クライアント側に情報を送り返すときに、res.end(responsetext)の代わりにres.send(responsetext )を使用する必要があります。

于 2018-03-16T10:04:47.593 に答える
1

質問は解決しましたが、エラーの正しい意味を明確にするための知識を共有します。

エラーは、関連するブレーキ機能に必要なパラメータが必要な形式、つまり文字列またはバッファではないことを示しています

解決策は、パラメータを文字列に変更することです

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

またはバッファ

breakingFunction(BSON.serialize(offendingParameter), ... other params...);
于 2018-05-03T19:24:20.777 に答える
0

最初の引数は、string型またはBuffer型のいずれかである必要があります。受信したタイプオブジェクト

 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});})
于 2020-01-11T10:29:22.430 に答える