Ошибка типа: mongodb_1.ObjectId не является конструктором с GridFsStorage

#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.