throw new ERR_INVALID_ARG_TYPE('chunk',['string','Buffer'],chunk);TypeError[ERR_INVALID_ARG_TYPE]:“c

Posted

技术标签:

【中文标题】throw new ERR_INVALID_ARG_TYPE(\'chunk\',[\'string\',\'Buffer\'],chunk);TypeError[ERR_INVALID_ARG_TYPE]:“chunk”参数必须是字符串或缓冲区类型【英文标题】:throw new ERR_INVALID_ARG_TYPE('chunk',['string','Buffer'],chunk);TypeError[ERR_INVALID_ARG_TYPE]:The "chunk" arg must be type string or Bufferthrow new ERR_INVALID_ARG_TYPE('chunk',['string','Buffer'],chunk);TypeError[ERR_INVALID_ARG_TYPE]:“chunk”参数必须是字符串或缓冲区类型 【发布时间】:2019-01-26 11:34:06 【问题描述】:

我正在尝试使用 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: 注释掉的行是我尝试过但失败的行。此外,节点服务代码 sn-p 中的注释行没有给出错误,并且在记录时显示正确,但控制器响应时的数据为空白。

【问题讨论】:

【参考方案1】:

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

【讨论】:

@jakarella,你所说的发送字符串是正确的,再加上另一个变化。我会将其发布为答案。感谢您的帮助。【参考方案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);
    );

【讨论】:

【参考方案3】:

我遇到了类似的错误。这是因为我将 process.pid 传递给 res.end()。当我将 process.pid 更改为 string 时它起作用了

res.end(process.pid.toString());

【讨论】:

【参考方案4】:

如果您使用“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) 

    );

【讨论】:

【参考方案5】:

谢谢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"
    )

【讨论】:

【参考方案6】:

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

pool.executeQuery( sql, name: '给定 SRC ID 的错误列表', 值:[], errorMsg: '获取时发生错误' ) .then(数据 =>

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

【讨论】:

【参考方案7】:

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

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

上下文示例代码。

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

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

nvm use 14
nvm

【讨论】:

以上是关于throw new ERR_INVALID_ARG_TYPE('chunk',['string','Buffer'],chunk);TypeError[ERR_INVALID_ARG_TYPE]:“c的主要内容,如果未能解决你的问题,请参考以下文章

在catch块中throw new Exception的意义(转)

throw new OwnExceptionClass 让程序崩溃

throw new TypeError('“继承”的超级构造函数不能 ' +

throw new TypeError(`$relative(cwd, fileName): Emit skipped`)

错误: throw new UnsupportedOperationException("方法未反编译

Eclipse + Spring Boot 中“throw new SilentExitException()”处的断点