ホーム>source

私は .json の内容を取得しようとしています  nodejsサービスを使用して、angularjsメソッドにファイルします。しかし、フォローしていますエラー:

_http_outgoing.js:700 throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); ^ TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string or Buffer. Received type object at ServerResponse.end (_http_outgoing.js:700:13)

対応するコードフラグメントを次に示します...

角度コントローラー: コメントされた行は、私が試して失敗したすべての行です。

var currentProcess = "process_1cA";
$scope.storestats = [];
var resAss = $resource('/procs/getstorestats');
var stats = resAss.get({
  process: currentProcess,
  date: date.getFullYear() + "" + m + "" + d
});
stats.$promise.then(function(response) {
  if (response != undefined) {
    //    var r = JSON.parse(response);
    //$scope.storestats.push(r);
    //$scope.storestats.push(r);
    //var r = JSON.parse(response);
    $scope.storestats.push(response);
    //angular.forEach(r, function(value, key) {
    //    $scope.storestats.push({key : value});
    //});
  }
});

NODEJsサービス:

httpApp.get('/procs/getstorestats', function(req, res, next) {
try {
    fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
        var msgs1 = JSON.parse(data);
        //var r  = data.toString('utf8');
        var msgs2 = JSON.stringify(msgs1);
        console.log(msgs1);
        res.end(msgs1);
    });
}
catch (err) {
    res.end(err.toString());
}});

追伸:コメントアウトされた行は、私が試して失敗したものです。また、ノードサービスコードスニペットのコメント行にはエラーは表示されず、ログに記録されると正しく表示されますが、コントローラーの応答時のデータは空白です。

あなたの答え
  • 解決した方法 # 1

    ここで少し推測していますが、 res.end() を変更する必要があると思います   res.send() へ  Nodeコードで。 「終了」メソッドは、データのチャンクをストリーミングしているときに end() を呼び出すときに使用されます  終わったら「送信」メソッドは、1回で応答を送信し、ノードにストリーミングを処理させるためのものです。

    また、必ず文字列を返送してください!

    httpApp.get('/procs/getstorestats', function(req, res, next) {
      try {
        fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
            var msgs1 = JSON.parse(data);
            //var r  = data.toString('utf8');
            var msgs2 = JSON.stringify(msgs1);
            console.log(msgs1);
            res.send(msgs2);  // NOTE THE CHANGE to `msg2` (the string version)
        });
      }
      catch (err) {
        res.send(err.toString());  // NOTE THE CHANGE
      }
    });
    
    

  • 解決した方法 # 2

    理解した。 2つの小さな変更が必要でした。コントローラーの1つは、「$resource.get」の代わりに「$resource.query」を使用することでした。そしてサービスでは、@ jakarellaが言ったように、.end()の文字列化された部分を使用する必要がありました。

    コントローラ:

                   var resAss = $resource('/procs/getstorestats');
                    var stats =  resAss.query({process: currentProcess, date: date.getFullYear() + "" + m + "" + d});
                    stats.$promise.then(function (response) {
                        $scope.storestats.push(response);
                    }
    
    

    ノードサービス:

    httpApp.get('/procs/getstorestats', function(req, res, next) {
    try {
        fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
            var msgs1 = JSON.parse(data);
            var msgs2 = JSON.stringify(msgs1);
            console.log(msgs2);
            res.end(msgs2);
        });
    }
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ python - クラス内に関数属性を含める方法は?