抛出新的ERR_INVALID_ARG_TYPE('chunk',['string','Buffer'],chunk); TypeError [ERR_INVALID_ARG_TYPE]:“ chunk” arg必须为string或Buffer类型

时间:2018-08-20 10:43:30

标签: angularjs json node.js

我正在尝试使用node js服务将.json文件的内容转换为angularjs方法。但是正在出现错误:

  

_http_outgoing.js:700         抛出新的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());
}});

P.S:注释掉的行是我尝试过但失败的行。另外,节点服务代码段中的带注释的行不会出现错误,并且在登录时会正确显示,但是响应控制器时的数据为空白。

7 个答案:

答案 0 :(得分:3)

我在这里有点猜测,但是我认为您只需要在Node代码中将res.end()更改为res.send()。当您正在流传输数据块时使用“ end”方法,然后在完成所有操作后调用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
  }
});

答案 1 :(得分:0)

Figured it out. 2 small changes were needed.. One in the controller, which was to use a "$resource.query" instead of "$resource.get". And in the service, as @jakarella said, had to use the stringified part in the .end();

Controller:

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

Node Service:

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

答案 2 :(得分:0)

我有一个类似的错误。这是因为我正在将process.pid传递给res.end()。当我将process.pid更改为字符串时,它起作用了

            DataGridViewRow row = new DataGridViewRow();
            row.CreateCells(FinalValuesDataGV);
            row.Cells[0].Value = "";
            FinalValuesDataGV.Rows.Insert(0, row);

答案 3 :(得分:0)

如果您使用的是“ request-promise”库,请设置json

var options = {
    uri: 'https://api.github.com/user/repos',
    qs: {
        access_token: 'xxxxx xxxxx' 
    },
    headers: {
        'User-Agent': 'Request-Promise'
    },
    json: true // Automatically parses the JSON string in the response
};

rp(options)
    .then(function (repos) {

    })
    .catch(function (err) {

    });

答案 4 :(得分:0)

谢谢user6184932,它能正常工作

try {
    await insertNewDocument(fileNameDB, taskId);
    res.end(process.pid.toString());
} catch (error) {
    console.log("error ocurred", error);
    res.send({
        "code": 400,
        "failed": "error ocurred"
    })
}

答案 5 :(得分:0)

在mysql2中,错误的原因是sql单词,sql是一个查询: const sql = select * from tableName

pool.executeQuery({ sql, 名称:“给定SRC ID的错误列表”, 值:[], errorMsg:'获取时发生错误' }) .then(data => {

  res.status(200).json({ data })
})
.catch(err => {
  console.log('\n \n ==  db , icorp fetching erro ====>  :  ', err.message, '\n \n')
})

答案 6 :(得分:0)

我在使用 Node v12 (12.14.1) 时遇到错误。

<块引用>

未捕获的类型错误 [ERR_INVALID_ARG_TYPE]:“块”参数必须是字符串或缓冲区类型之一。收到的型号

上下文示例代码。

const { Readable } = require('stream')
Readable.from(Buffer.from(base64content, 'base64'))
    .pipe( ... )

解决方案(就我而言)是升级到 Node v14 (14.17.3)。例如

nvm use 14