![](/img/trans.png)
[英]How can I upload a file directly into a MongoDB schema with multer/gridfs in NodeJS?
[英]How can I delete a file with multer gridfs storage?
以下代码按预期工作以上传和检索文件:
// Mongo URI
const mongoURI = 'mongodbconnstring';
// // Create mongo connection
const conn = mongoose.createConnection(mongoURI);
// // Init gfs
let gfs;
conn.once('open', () => {
gfs = new mongoose.mongo.GridFSBucket(conn.db, {
bucketName: 'Uploads'
});
});
// Create storage engine
const storage = new GridFsStorage({
url: mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
const filename = file.originalname; //+ Date.now();
const fileInfo = {
filename: filename,
bucketName: 'Uploads'
};
resolve(fileInfo);
});
}
});
const upload = multer({ storage });
// // @route POST /upload
// // @desc Uploads file to DB
routerUpload.post('/upload', upload.single('files'), (req, res) => {
//res.json({file: req.file})
res.redirect('/');
});
// @route GET /files
// @desc Display all files in json
routerUpload.get('/files', (req, res) => {
gfs.find().toArray((err, files) => {
// Check if files
if (!files || files.length === 0) {
return res.status(404).json({
err: 'No files exist'
});
}
return res.json(files);
});
});
// @route GET /files/:filename
// @desc Display single file object
routerUpload.get('/files/:filename', (req, res) => {
const file = gfs
.find({
filename: req.params.filename
})
.toArray((err, files) => {
if (!files || files.length === 0) {
return res.status(404).json({
err: 'No file exists'
});
}
gfs.openDownloadStreamByName(req.params.filename).pipe(res);
});
});
但是,当我调用下面的代码按 ID 删除文件时:
// @route DELETE /files/:id
// @desc Delete file
routerUpload.post('/files/del/:id', (req, res) => {
gfs.delete(req.params.id, (err, data) => {
if (err) {
return res.status(404).json({ err: err.message });
}
res.redirect('/');
});
});
我在 Postman 中收到此错误:
{
"err": "FileNotFound: no file with id 5db097dae62a27455c3ab743 found"
}
谁能指出我需要 go 的方向吗? 我尝试使用 delete 方法而不是 post,甚至指定了文件的根目录,但发生了同样的错误。 谢谢!
你试过这个
// @route DELETE /files/:id
// @desc Delete file
routerUpload.post('/files/del/:id', (req, res) => {
gfs.remove({ _id: req.params.id, root: "uploads" }, (err, gridStore) => {
if (err) {
return res.status(404).json({ err });
}
return;
});
});
但是我使用的是旧版本的快递,因此收到了这个
(节点:6024)DeprecationWarning:collection.remove 已弃用。 请改用 deleteOne、deleteMany 或 bulkWrite。
和
(节点:6024)弃用警告:Mongoose:不推荐使用未将
useFindAndModify
选项设置为 false 的findOneAndUpdate()
和findOneAndDelete()
这是由于我使用的 express、multer 和 GridFs 的版本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.