从我的API(nodejs),我正在访问第三方API(使用http)来下载文件。 该服务返回一个Base64字符串,切成小块,以便能够处理更大的文件。
是否可以向第三方服务发送多个http请求(循环?),将每个响应的内容发送到浏览器,直到第三方服务不再有任何响应为止?
我想这样做的原因是因为我不想消耗节点服务器上的大量内存。
我会把这些碎片放回浏览器中。
有关如何执行此操作的任何建议? 请参阅下面的我当前的代码。
var request = require('request');
router.post('/getfiledata', function(req, res) {
var fileid = req.body.fileid;
var token = req.headers.authorization;
getFileData(req, res, dbconfig, fileid, token, function(err, chunkOfFile) {
if (err) {
res.status(500).send({
status: 500,
message: err
});
return;
}
res.send(chunkOfFile);
});
});
function getFileData(req, res, dbconfig, fileid, token, next) {
var url ="http://*ip*/service/rest/getfiledata";
var reqbody = {
fileId: fileid
};
var options = {
url: url,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': token
},
json: true,
body: reqbody
};
/*SOME LOOP HERE TO GET EACH CHUNK AND SEND TO BROWSER*/
request(options, function(err, resp, body) {
if (err) {
console.log(err);
next(err, undefined);
return;
} else {
next(undefined, body)
};
});
};
答案 0 :(得分:0)
我认为您需要Socket.io将块推送到浏览器。
服务器:
socket.send("chunk", chunkOfFile)
客户:
let fullString = ""
socket.on("chunk", chunkOfFile => fullString += chunkOfFile )
像这样的东西
答案 1 :(得分:0)
您正在使用的request
库允许将数据从一个源流式传输到另一个源。查看github上的文档。
以下是该页面的示例:
request
.get(source)
.on('response', function(response) {
console.log(response.statusCode) // 200
console.log(response.headers['content-type']) // 'image/png'
})
.pipe(request.put(destination))
您可以选择使用Nodejs中的http
模块,因为它也实现了EventEmitter类。
答案 2 :(得分:0)
我最终从客户端做了一个递归循环。将http请求发送到我的API(节点),直到响应不再返回任何base64数据块。
谢谢你们!