我正在使用微服务架构。假设有两种服务,即 A 和 B 。我正在尝试从服务 A 请求到服务 B ,该服务从数据库中获取一些数据并将其作为对服务 A 的响应。但是,当有大量数据时,服务 B 无法发送响应,但会在控制台上打印。我尝试了很多事情,但没有任何效果。请帮助我。
服务A
function makePostRequest(url, data, cb) {
let postContents = {
headers: {
'content-type': 'application/json'
},
url: url,
form: data,
timeout: 1200000
}
console.log('POST ==> ', postContents)
request.post(postContents, function(err, response, body) {
console.log(err)
if (err) {
return cb({
code: httpStatus.serverError,
message: err
})
}
else if (response.statusCode != 200) {
return cb({
code: response.statusCode,
message: body
})
}
else {
console.log(body, 'bodybodybodyPOST')
try {
var data = JSON.parse(body);
if (data && typeof data == 'object')
return cb(null, data)
else
return cb({
code: httpStatus.serverError,
message: 'invalid response'
})
}
catch(Ex) {
console.log(Ex)
return cb({
code: httpStatus.serverError,
message: Ex
})
}
}
})
}
exports.myapi = (req, res) => {
makePostRequest(SERVICE-B-URL, POST-DATA, (e, d) => {
if (e) res.status(500).json({msg: 'please try later'})
else res.status(200).json({msg: 'data fetched', result: d})
})
}
服务B
console.log(result)
console.log('sending response ...', resTotal)
res.status(200).json({
total: resTotal,
result: result,
condition: req.query
});
[RowDataPacket { f_stamp:2019-05-25T05:17:48.000Z, f_player_id:33370333, 金额:-0.5, f_param_notes:空, f_money_type:“ R”, f_type:84}, RowDataPacket { f_stamp:2019-05-25T05:14:44.000Z, f_player_id:31946955, 数量:30.9, f_param_notes:空, f_money_type:“ R”, f_type:70}, RowDataPacket { f_stamp:2019-05-25T05:14:41.000Z, f_player_id:31035703, 数量:258 f_param_notes:空, f_money_type:“ R”, f_type:70}, ... 163783更多项目] 正在发送响应...。163883
答案 0 :(得分:0)
一种解决方案是将nodejs流和websocket组合在一起,这里是一个示例:
Streaming data in node.js with ws and websocket-stream
通常,当您有大量数据时,您希望一次获取一小部分并发送。另一方面,您可以收集这些小片段并重建更大的数据。
使用单个HTTP请求,通常会出现413错误(有效负载过大)。 为了避免此错误,您应该将服务器设置为接受更大的有效负载。
ExpressJS示例(更多信息在这里:Error: request entity too large)
app.use(express.json({limit: '50mb'}));
Nginx示例
server {
client_max_body_size 100M;
...
}