类型错误:mongodb_1.ObjectID 不是带有 GridFsStorage 的构造函数

问题描述

我是 nodejs 和 mongoDB 的新手,任何人都可以帮我解决这个问题。我曾经multermulter-gridfs-storagegridfs-stream strong> 用于上传文件和图像。 但是我在 GridFsstorage 的 promise 中的 resolve() 中得到了这个 TypeError: mongodb_1.ObjectID is not a constructor。我已经分享了下面的代码

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
   })
})

enter image description here

解决方法

我的解决方案是将其节点模块的 gridfs.js 文件中的 mongodb_1.ObjectID() 更改为 mongodb_1.ObjectI"d"() 并且一切正常。我猜作者是为旧版本的 mongodb 写的,但就我而言,它是新版本,所以“d”应该是小写的。

更新:

刚刚有人在作者的github上发了一个issue,官方解决方法可以关注this page

,

您必须调用 mongodb.ObjectId 而不是 ObjectID,然后您就可以拥有一个具有该名称的常量。但是有了 ObjectId 一切都会好起来的。 继续编码。

,

访问 https://github.com/devconcept/multer-gridfs-storage/issues/352#issue-946945336 将方法名称从 mongodb_1 类的 ObjectID() 更改为 ObjectId() 对我有用,看起来像是 node_modules 中 gridfs.js 文件中的兼容性问题。