TypeError: GridFsStorage不是构造函数报错问题求助
解决「TypeError: GridFsStorage is not a constructor」问题
这个报错大概率是因为multer-gridfs-storage模块的引入方式和版本不匹配导致的,我来一步步帮你排查解决:
1. 修正模块引入方式
从v4版本开始,multer-gridfs-storage的CommonJS导出方式发生了变化,你原来的引入方式只适用于旧版本。请把依赖引入代码改成以下两种方式之一:
方式一:使用.default获取默认导出
const GridFsStorage = require('multer-gridfs-storage').default;
方式二:解构导出的构造函数
const { GridFsStorage } = require('multer-gridfs-storage');
2. 修复代码中的拼写错误
虽然这不是当前报错的直接原因,但你的代码里有一个变量名拼写错误,会导致后续执行失败:
在file回调里,你定义的是const fileInfor = {...},但resolve时写的是resolve(fileInfo)(多了一个m),请修正为:
resolve(fileInfor);
3. 验证版本兼容性
如果上述修改后仍报错,可以检查项目中multer-gridfs-storage的版本:
打开项目根目录的package.json,查看multer-gridfs-storage的版本号:
- 若为v4及以上版本,用上面的新引入方式即可;
- 若为v3及以下版本,原引入方式是可行的,此时需要检查mongoose、multer等依赖的版本是否兼容。
修正后的完整代码示例
const GridFsStorage = require('multer-gridfs-storage').default; const multer = require('multer'); const crypto = require('crypto'); const path = require('path'); const mongoose = require('mongoose'); const DBURI = '你的数据库连接字符串'; const conn = mongoose.createConnection(DBURI); let gfs; conn.once('open', ()=> { // 新版GridFSBucket替代旧的Grid API gfs = mongoose.mongo.GridFSBucket(conn.db, { bucketName: 'uploads' }); }) const storage = new GridFsStorage({ url: DBURI, 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 fileInfor = { filename: filename, bucketName: 'uploads' }; resolve(fileInfor); // 修正拼写错误 }); }); } }); const upload = multer({storage});
另外补充一点:新版MongoDB驱动已经用GridFSBucket替代了旧的Grid API,上面的代码也同步做了更新,能避免后续可能出现的API兼容性问题。
内容的提问来源于stack exchange,提问作者Gabriel Gavrilov
相关产品推荐
相关产品推荐

