我正在尝试按照教程进行操作,并将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 不是构造函数
为此,我没有得到有关堆栈溢出或任何其他网站的任何修复。有人可以帮忙吗
正确的解决方案是使用新的
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);
});