Node.js MongoDB GridFS API返回损坏的.zip
上下文: Node.js/Loopback应用程序,该应用程序使用包含旧企业CRM应用程序数据的.zip文件填充其数据库。我正在尝试使用GridFS将.zip文件的二进制文件存储到数据库中,以便进行生产调试,因为该文件可以>16mb,并且可以随时使用管理端点检索它 问题: 我可以使用函数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
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!