我正在尝试使用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:注释掉的行是我尝试过但失败的行。另外,节点服务代码段中的带注释的行不会出现错误,并且在登录时会正确显示,但是响应控制器时的数据为空白。
答案 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