我遇到了nodejs和gridfs的以下问题。我有一堆.tif文件存储在gridfs中,带有gfs.createWriteStream,所有这些都是正确的(我用gdalinfo检查了这个。)
当我使用gfs.createReadStream
提取文件时,其中一些文件已损坏;在tif头中修改了几个字节。
我该如何调查此问题?是否也可以读取块以了解它们是否已损坏?
这是代码,写给gfs:
const Grid = require('gridfs-stream');
var gfs = new Grid(mongoose.connection.db, mongoose.mongo);
[...]
var readstream = fs.createReadStream(filePath);
var writestream = gfs.createWriteStream({
filename: filename,
metadata: metadata,
mode: 'w',
content_type: 'image/tiff'
})
[..]
readstream.pipe(writestream);
提取类似。
[编辑] 实际上经过进一步的调查,我意识到腐败是在GridF之前发生的: 如果我创建一个写入流到磁盘(使用fs)同时我创建一个写入GridFS的流,我在文件中也有同样的错误。所以它似乎只与fs TIF读/写有关...
async.eachLimit(filesToCopy,4, function(file, next) {
var filePath = path.join(inputFolder, file);
var readStream = fs.createReadStream(filePath);
readStream.on('error') {
// do something
next(error);
return;
}
var writestream = fs.createWriteStream(newFilePath);
writestream.on('close', function(writtenfile) {
//do something
next();
}
readstream.pipe(writestream);
}, function(error) {
if (error) {
callback(error);
}
callback(null, ...)
});
答案 0 :(得分:0)
实际上问题不是来自GridFS,也不是来自阅读。 问题是.tif文件在完全刷新之前由节点js读取。这解释了为什么它是如此随机,以及为什么它总是被损坏的相同字节。 在文件读取之前设置超时解决了问题。
感谢robertklep的帖子,它帮助我找到了解决方案。