如何修复 Nodejs 和“gridfs-stream”的错误

问题描述 投票:0回答:1

我正在尝试按照教程进行操作,并将nodejs与“gridfs-stream”以及react前端一起使用。教程是去年2020年的。

这是我的代码。

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const cors = require('cors')
const multer = require('multer');
const {GridFsStorage} = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const path = require('path');
const Pusher = require('pusher')

const mongoPosts = require ('./mongoPosts.js')
// const currentTournamentControllers = require('../controllers/currenttournament-controllers');



const app = express();
const port = process.env.PORT || 9000


app.use(bodyParser.json())
app.use(cors())

const mongoURI = 'mongodb+srv://fbclient:[email protected]/myFirstDatabase?retryWrites=true&w=majority'

const conn = mongoose.createConnection(mongoURI);
mongoose.connect(mongoURI)
mongoose.connection.once('open', () => {
    console.log('DB Connected')
})

let gfs

conn.once('open', () => {
    // Init stream
    gfs = Grid(conn.db, mongoose.mongo);
    gfs.collection('images');
  });

  const storage = new GridFsStorage({
    url: mongoURI,
    file: (req, file) => {
        return new Promise((resolve, reject) => {{
            const filename = `image-${Date.now()}${path.extname(file.originalname)}`   
            const fileInfo = {
                filename: filename,
                bucketName: 'images'
            }
            resolve (fileInfo)
        }})
    }
})

const upload = multer({storage})

app.get('/', (req, res) => res.status(200).send('hello world'))

app.post('/upload/image', upload.single('file'), (req, res) => {
    res.status(201).send(req.file)
})

app.post('/upload/post', (req, res) => {
    const dbPost = req.body
    console.log(dbPost)
    mongoPosts.create(dbPost, (err, data) => {
        if(err){
            res.status(500).send(err)
        } else {
            res.status(201).send(data)
        }
    })
})

app.get('/retrieve/image/single', (req, res) => {
    console.log(req.query.name)
    gfs.files.findOne({filename: req.query.name}, (err, file) => {
        if(err) {
            res.status(500).send(err)
        } else {
            console.log(file)
            if(!file || file.length === 0) {
                console.log("hi i errored out")
                res.status(404).json({err: 'file not found'})
            } else {
                console.log("hi i am trying to read")
                const readstream = gfs.createReadStream(file.filename)
                readstream.pipe(res)
            }
        }
    })
})

app.get('/retrieve/posts', (req, res) => {
    mongoPosts.find((err, data) => {
        if(err){
            res.status(500).send(err)
        } else {
            data.sort((b,a) => {
                return a.timestamp - b.timestamp
            })
            res.status(200).send(data)
        }
    })
})



app.listen(port, () => console.log(`listening on localhost:${port}`))   

问题出在 readstream 上。当我尝试检索数据时,它显示错误 类型错误:grid.mongo.ObjectID 不是构造函数

我做了一些调试,发现可以通过更改 node_modules 中 gridfs.js 文件内的值来解决此问题。 Stack Overflow 上建议的更改是这样的:-

this._store = new grid.mongo.GridStore(grid.db, this.id || new grid.mongo.ObjectID(), this.name, this.mode, options);

更改为

this._store = new grid.mongo.GridStore(grid.db, this.id || new grid.mongo.ObjectId(), this.name, this.mode, options);

建议是将 grid.mongo.ObjectID 值更改为 grid.mongo.ObjectId。所以我就这么做了。现在出现的错误如下:-

类型错误:grid.mongo.GridStore 不是构造函数

为此,我没有得到有关堆栈溢出或任何其他网站的任何修复。有人可以帮忙吗

javascript node.js mongodb mongoose gridfs-stream
1个回答
0
投票

正确的解决方案是使用新的

GridFSBucket
API 提供与 MongoDB 驱动程序更好的集成,并替换已弃用的
GridStore
。这应该可以顺利地与 MongoDB v6.x 及更高版本一起使用。

GridFSBucket
是由MongoDB驱动(mongodb包)直接提供的,所以你不再需要gridfs-stream包。 使用方法
bucket.openUploadStream
代替
gfs.createWriteStream
。 新的
GridFSBucket
API 更符合 MongoDB 的本机方法,并且与最新的 MongoDB 驱动程序版本(如 mongodb 6.x)配合良好。

这里是我的旧代码

// Init GridFS
let gfs;
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('uploads');

// Create a write stream
 const writestream = gfs.createWriteStream({
   filename: 'myfile.txt',
 });
    
// Pipe data from file to GridFS
fs.createReadStream('path/to/local/file.txt').pipe(writestream);
    
writestream.on('close', (file) => {
  console.log('File has been written to GridFS:', file);
});

这是我的新代码

// Init GridFSBucket
const bucket = new GridFSBucket(conn.db, {
   bucketName: 'uploads',
});
    
// Create an upload stream
const uploadStream = bucket.openUploadStream('myfile.txt');
    
// Pipe data from file to GridFS
fs.createReadStream('path/to/local/file.txt').pipe(uploadStream);
    
uploadStream.on('finish', (file) => {
  console.log('File has been written to GridFS:', file);
});
    
uploadStream.on('error', (error) => {
  console.error('Error uploading file:', error);
});
© www.soinside.com 2019 - 2024. All rights reserved.