#node.js #mongodb #multer-gridfs-storage
Вопрос:
Я новичок в nodejs вместе с MongoDB, может ли кто-нибудь помочь мне решить эту проблему. я использовал multer, multer-gridfs-хранилище, gridfs-поток для загрузки файлов и изображений. Но я получаю эту ошибку типа: mongodb_1.ObjectId не является конструктором в resolve() внутри обещания в GridFsStorage. я поделился приведенным ниже кодом.
const express = require('express');
const app = express();
require('dotenv').config()
const PORT = process.env.PORT;
const morgan = require('morgan');
const multer = require('multer');
const {GridFsStorage} = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const methodOverride = require('method-override');
const mongoose = require('mongoose');
const path = require('path');
const crypto = require('crypto');
const MongoURI = "atlas url";
app.use(methodOverride('_method'));
app.use(express.json())
app.use(morgan(':method :status :url'));
const connectDB = mongoose.createConnection(MongoURI,{useUnifiedTopology:true,useFindAndModify:false, useNewUrlParser:true,useCreateIndex: true})
let gfs;
connectDB.once('open',()=>{
console.log("dbConnected....")
gfs = Grid(connectDB.db,mongoose.mongo)
gfs.collection('uploads');
})
const storage = new GridFsStorage({
url:MongoURI,
file:(req,file)=>{
return new Promise((resolve, reject)=>{
crypto.randomBytes(16,(err,buf)=>{
console.log("buf",buf)
if(err){
return reject(err);
}
const filename = buf.toString('hex') path.extname(file.originalname);
console.log("filename",filename)
const fileInfo = {
filename:filename,
bucketName:'uploads'
};
resolve(fileInfo)
})
})
}
})
app.listen(PORT,()=>{
console.log(`port connected....${PORT}`)
})
const upload = multer({storage:storage})
app.post('/uploadfile',upload.single('file'),async(req,res)=>{
res.json({
file:req.file
})
})
Ответ №1:
Мое решение состоит в том, чтобы изменить mongodb_1.ObjectId() внутри модуля узла gridfs.js файл в mongodb_1.ObjectI»d» (), и все работает. Я предполагаю, что автор пишет для старой версии mongodb, но в моем случае это более новая версия, поэтому «d» должно быть в нижнем регистре.
Обновить:
Кто — то просто разместил проблему на github автора, вы можете перейти на эту страницу для официальных решений.
Ответ №2:
Вы должны вызвать mongodb.ObjectId, а не ObjectId, и тогда у вас может быть константа с этим именем. Но с ObjectId все будет работать. Продолжайте кодировать.
Ответ №3:
Посещение https://github.com/devconcept/multer-gridfs-storage/issues/352#issue-946945336 Изменение имени метода с ObjectId() на ObjectId() класса mongodb_1 сработало для меня, похоже, проблема совместимости в gridfs.js файл в node_modules.