throw new ERR_INVALID_ARG_TYPE('chunk',\['string','Buffer'\],chunk);TypeError\[ERR_INVALID_ARG_TYPE\]:“chunk”参数必须是字符串或缓冲区类型

新手上路,请多包涵

我正在尝试使用节点 js 服务将 .json 文件的内容获取到 angularjs 方法中。但我收到以下 错误:

_http_outgoing.js:700 throw new ERR_INVALID_ARG_TYPE(‘chunk’, [‘string’, ‘Buffer’], chunk); ^ TypeError [ERR_INVALID_ARG_TYPE]:“块”参数必须是字符串或缓冲区类型之一。在 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());
}});

PS: 注释掉的行是我尝试过但失败的行。此外,节点服务代码片段中的注释行没有给出错误,并且在记录时显示正确,但控制器响应时的数据为空白。

原文由 Harshith Rai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 805
2 个回答

弄清楚了。需要进行 2 处小改动。在控制器中进行一处改动,即使用“\(resource.query”而不是“\)resource.get”。正如@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);
    });
}

原文由 Harshith Rai 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在这里猜测了一下,但我认为您只需要在您的节点代码中将 res.end() 更改为 res.send() 。当您流式传输数据块时使用“结束”方法,然后在完成后调用 end() 。 “发送”方法用于一次发送响应并让 Node 处理流。

另外,请确保您发回了一个字符串!

 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
  }
});

原文由 Jordan Kasper 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题