Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB GridFS API返回损坏的.zip_Node.js_Mongodb_Gridfs - Fatal编程技术网

Node.js MongoDB GridFS API返回损坏的.zip

Node.js MongoDB GridFS API返回损坏的.zip,node.js,mongodb,gridfs,Node.js,Mongodb,Gridfs,上下文: Node.js/Loopback应用程序,该应用程序使用包含旧企业CRM应用程序数据的.zip文件填充其数据库。我正在尝试使用GridFS将.zip文件的二进制文件存储到数据库中,以便进行生产调试,因为该文件可以>16mb,并且可以随时使用管理端点检索它 问题: 我可以使用函数storeLatestZipFile在我的模块中存储zip文件,并且我可以使用函数createLatestZipEndpoint创建的端点检索它 但是,我要返回的.zip文件比原始文件(14.7mb对21.1mb

上下文:

Node.js/Loopback应用程序,该应用程序使用包含旧企业CRM应用程序数据的.zip文件填充其数据库。我正在尝试使用GridFS将.zip文件的二进制文件存储到数据库中,以便进行生产调试,因为该文件可以>16mb,并且可以随时使用管理端点检索它

问题:

我可以使用函数
storeLatestZipFile
在我的模块中存储zip文件,并且我可以使用函数
createLatestZipEndpoint
创建的端点检索它

但是,我要返回的.zip文件比原始文件(14.7mb对21.1mb)大,并且它也已损坏

我假设我没有对数据进行编码,或者只是没有正确使用GridFS API。是否有人碰巧发现了我代码中的错误/在使用GridFS存储.zips方面有更多的经验

有关模块:

const{pino}=require('amf-logger');
常数fs=要求('fs');
const mongo=require('mongodb');
const log=pino({name:'bot-zip上传存储'});
/**
*@param{string}路径要持久化的zip文件的路径。
*@param{object}app环回应用程序实例。
*/
函数storeLatestZipFile(路径='./',应用={}){
log.info('****开始流媒体当前上传到DB****');
const zipReadStream=fs.createReadStream(路径,{encoding:'binary'});
const{db}=app.dataSources.mongo.connector;
const bucket=新的mongo.GridFSBucket(db);
bucket.delete('zipfile',()=>{
log.info('deleted old zipfile');
const uploadStream=bucket.openUploadStreamWithId(
“zipfile”,
`bot数据-${new Date().toISOString()}`,
{
contentType:'应用程序/zip'
}
);
预流管道(上传流);
});
}
/**
*@param{object}app环回应用程序实例。
*/
异步函数createLatestZipEndpoint(app={}){
如果(!app.get){
log.error(“应用程序对象没有'get'属性。”);
返回;
}
app.get('/api/admin/latestzip',异步(req,res)=>{
如果(!req.headers.latestfile | | req.headers.latestfile!==process.env.ADMIN_latestfile){
res.sendStatus(403);
返回;
}
试一试{
const{db}=app.dataSources.mongo.connector;
const bucket=新的mongo.GridFSBucket(db);
res.writeHead(200,{'Content-Type':'application/zip'});
const downloadStream=bucket.openDownloadStream('zipfile');
log.info('下载流打开,开始流');
下载流。管道(res);
}捕捉(错误){
error(`error get zipfile:${err}`);
res.sendStatus(500);
}
});
}
module.exports={
storeLatestZipFile,
createLatestZipEndpoint

};您是否尝试过
createReadStream
而不使用
缓冲区
-编码


const zipReadStream=fs.createReadStream(路径)

就是这样!我可以问一下为什么
encoding:binary
会把事情搞砸吗?@jsur请看:
encoding:binary
并不是真正意义上的二进制。谢谢@KevinAdistambha!