如何将网格存储替换为网格FSBucket?



我有此错误消息:

(node:11976) DeprecationWarning: GridStore is deprecated, and will be removed in a future version. Please use GridFSBucket instead

有时我在查看图片时遇到问题,我想正因为如此,由于文档不佳,我不知道如何将我的代码切换到 GridFSBucket,就是这样:

conn.once("open", () => {
// Init stream
gfs = Grid(conn.db, mongoose.mongo);
//gfs = new mongoose.mongo.GridFSBucket(conn.db);
gfs.collection("user_images");
});

var storageImage = new GridFsStorage({
url: dbURI,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString("hex") + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: "user_images"
};
resolve(fileInfo);
});
});
}
});
const uploadImage = multer({ storage: storageImage });
const uploadImage = multer({ storage: storageImage });
router.get("/image/:filename", (req, res) => {
gfs.files.findOne({ filename: req.params.filename }, (err, file) => {
if (!file || file.length === 0) {
return res.status(404).json({
err: "No file exists"
});
}
if (file.contentType === "image/jpeg" || file.contentType === "image/png") {
const readstream = gfs.createReadStream(file.filename);
//const readstream = gridFSBucket.openUploadStream(file.filename);
readstream.pipe(res);
} else {
res.status(404).json({
err: "Not an image"
});
}
});
});

我真的很感激你的帮助,我需要在这里更改什么才能使其与 GridFsBucket 一起使用,提前非常感谢!

派对迟到了,但由于我偶然发现了同样的问题,而现有的答案并不能解决问题,所以我会继续发布我发现的内容,以防其他人将来偶然发现同样的问题:

// Old Way:
const conn = mongoose.createConnection(youConnectionURI);
const gfs = require('gridfs-store')(conn.db);
gfs.collection('yourBucketName');
// New Way:
const conn = mongoose.createConnection(youConnectionURI);
const gridFSBucket = new mongoose.mongo.GridFSBucket(conn.db, {bucketName: 'yourBucketName'});

有关如何使用GridFSBucket执行CRUD 操作的详细信息,请查看此页面和此页面。

我最终遇到了同样的问题,您很可能已经确定readstream = gfs.createReadStream(file.filename(; 是导致错误的原因。只需要添加一个新变量并更改一行。

//add var
let gridFSBucket;
let gfs;
connection.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
// add value to new var
gridFSBucket = new mongoose.mongo.GridFSBucket(conn.db, {
bucketName: 'user_images'
});
gfs = Grid(connection.db, mongoose.mongo);
gfs.collection(image_bucket_name);
if (file.contentType === 'image/jpeg' || file.contentType === 'image/png') {
//now instead of const readstream = gfs.createReadStream(file.filename);
//add this line
const readStream = gridFSBucket.openDownloadStream(file._id);
readSteam.pipe(res);
}
});

如果遇到 ( 弃用警告:GridStore 已弃用,并将在将来的版本中删除。请使用 GridFSBucket 代替(,希望这可以为您节省一些时间。

我按照本教程创建了这个食谱。教程很棒,它很好地解释了所有步骤。完整的代码示例可以在这里找到。

网页表单示例:

<form action="http://localhost:4000/upload" method="post" enctype="multipart/form-data">
<input type="file"  name='image' />
<button type="submit" >Submit</button>
</form>

将图像上传到 mongodb 的控制器配方:

const path = require('path');
const crypto = require('crypto');
const mongoose = require('mongoose');
const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const mongodbURL="mongodb+srv://<user>:<pass>@cluster.mongodb.net/<databaseName>"
const connection = mongoose.createConnection(mongoURI);
// Init gfs
let gfs;
const image_bucket_name = "user_images"
connection.once('open', () => {
// Init stream
gfs = Grid(connection.db, mongoose.mongo);
gfs.collection(image_bucket_name);
})
// Create storage engine
const storage = new GridFsStorage({
url: mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (error, buffer) => {
if (error) {
return reject(error);
}
const filename = buffer.toString('hex') + path.extname(file.originalname);
const fileinfo = {
filename: filename,
bucketName: image_bucket_name
};
resolve(fileinfo);
})
});
}
});
const upload = multer({ storage });
app.post('/upload', upload.single('image'), async (req, res) => {
console.log("uploaded image: "+req.file.
});

最新更新