无法使用 GridFsStorage 将文件上传到 mongodb
unable to upload files to mongodb with GridFsStorage
数据库连接文件
const mongoose = require('mongoose');
const multer = require('multer')
const {GridFsStorage} = require('multer-gridfs-storage')
const Grid = require('gridfs-stream');
const path = require('path');
const dotenv = require('dotenv');
const crypto = require('crypto')
dotenv.config( { path : 'config.env'} )
let storage;
exports.connectDB = ()=>{
try{
const con = mongoose.createConnection(process.env.MONGO_URL,{
useNewUrlParser:true,
useUnifiedTopology:true,
})
con.once('open', () => {
// Init stream
const gfs = Grid(con.db, mongoose.mongo);
gfs.collection('uploads');
});
console.log(`MongoDB connected:${con}`)
}catch(err){
console.log(err);
process.exit(1);
}
}
exports.createStorage = ()=>{
storage = new GridFsStorage({
url: process.env.MONGO_URL,
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: 'uploads'
};
resolve(fileInfo);
});
});
}
});
console.log('storage created')
}
exports.upload = multer({storage})
post 上传作为中间件的请求
route.post('/example',database.upload.single('file'),async (req,res)=>{
res.json({file:req.file})
})
当我用 postman 发出 post 请求时没有错误,但是文件没有上传 MongoDB 上传集合也没有被创建。
我正在从 index.js
调用 connectDB 和 createStorage
database.connectDB();
database.createStorage();
我解决了。问题是
exports.upload = multer({storage})
这行代码是在调用
之前执行的
database.createStorage();
所以解决方案是
exports.createStorage = ()=>{
storage = new GridFsStorage({
url:process.env.MONGO_URL,
// db:conn.connection.db,
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: 'uploads'
};
resolve(fileInfo);
});
});
}
});
exports.upload = multer({storage})
}
数据库连接文件
const mongoose = require('mongoose');
const multer = require('multer')
const {GridFsStorage} = require('multer-gridfs-storage')
const Grid = require('gridfs-stream');
const path = require('path');
const dotenv = require('dotenv');
const crypto = require('crypto')
dotenv.config( { path : 'config.env'} )
let storage;
exports.connectDB = ()=>{
try{
const con = mongoose.createConnection(process.env.MONGO_URL,{
useNewUrlParser:true,
useUnifiedTopology:true,
})
con.once('open', () => {
// Init stream
const gfs = Grid(con.db, mongoose.mongo);
gfs.collection('uploads');
});
console.log(`MongoDB connected:${con}`)
}catch(err){
console.log(err);
process.exit(1);
}
}
exports.createStorage = ()=>{
storage = new GridFsStorage({
url: process.env.MONGO_URL,
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: 'uploads'
};
resolve(fileInfo);
});
});
}
});
console.log('storage created')
}
exports.upload = multer({storage})
post 上传作为中间件的请求
route.post('/example',database.upload.single('file'),async (req,res)=>{
res.json({file:req.file})
})
当我用 postman 发出 post 请求时没有错误,但是文件没有上传 MongoDB 上传集合也没有被创建。
我正在从 index.js
调用 connectDB 和 createStoragedatabase.connectDB();
database.createStorage();
我解决了。问题是
exports.upload = multer({storage})
这行代码是在调用
之前执行的database.createStorage();
所以解决方案是
exports.createStorage = ()=>{
storage = new GridFsStorage({
url:process.env.MONGO_URL,
// db:conn.connection.db,
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: 'uploads'
};
resolve(fileInfo);
});
});
}
});
exports.upload = multer({storage})
}