我无法使用 GridFS 从 mongodb 下载数据的问题是什么?
What's the issue which fails me to download data from mongodb using GridFS?
我正在尝试编写一个应用程序,其功能包括在 MongoDB 中存储文件。我成功地使用 GridFS 库将文件上传到那里,但后来我多次尝试访问数据都失败了。使用此请求加载文件元数据时,我不断收到内部服务器错误的响应:
router.get('/uploads', async (req,res) => {
try {
gfs.files.find().toArray( (err, files) => {
if(!files || files.length === 0) {
return res.status(404).json({message: 'No files exisits'})
}
})
res.status(200).json(files);
} catch (error) {
return res.status(500).json({ message: "Could not find files, please try again" });
}})
内容类型:application/json;字符集=utf-8
另一个下载特定文件数据的请求破坏了我的整个后端,我得到了这个错误:
Proxy error: Could not proxy request /api/user/getuser from localhost:3000 to http://localhost:4000/ (ECONNREFUSED).
在那之后,我的 none 个请求在任何页面上都能正常工作。
这是该请求的 nodejs 代码:
router.get('/uploads/:filename', async (req,res) => {
try {
gfs.files.findOne({filename: req.params.filename}, (err, file) => {
if(!file || file.length === 0) {
return res.status(404).json({message: 'No file exisits'})
}
})
res.status(200).json(file);
} catch (error) {
return res.status(500).json({ message: "Could not find files, please try again" });
}})
接下来是 GridFs 配置:
const conn = mongoose.createConnection(config.get('mongoURI'));
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('uploads');
})
const storage = new GridFsStorage({
url: config.get('mongoURI'),
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(15, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads'
};
resolve(fileInfo);
});
});
}
});
我想我在文档中遗漏了一些重要的东西,我什至没有尝试下载整个图像,我卡住了。非常感谢有用的建议!
我找到了导致错误的问题!在模拟我的请求时,我收到了这个错误:
[0] Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
因此问题出在我的那部分代码中:
res.status(200).json(文件);
Nodejs 不允许在发送实际 body 请求后设置状态 header。
所以我必须做的所有修复是:
res.status(200).json(files) to --> res.json(files);
我希望该解决方案对某人有用。
我正在尝试编写一个应用程序,其功能包括在 MongoDB 中存储文件。我成功地使用 GridFS 库将文件上传到那里,但后来我多次尝试访问数据都失败了。使用此请求加载文件元数据时,我不断收到内部服务器错误的响应:
router.get('/uploads', async (req,res) => {
try {
gfs.files.find().toArray( (err, files) => {
if(!files || files.length === 0) {
return res.status(404).json({message: 'No files exisits'})
}
})
res.status(200).json(files);
} catch (error) {
return res.status(500).json({ message: "Could not find files, please try again" });
}})
内容类型:application/json;字符集=utf-8
另一个下载特定文件数据的请求破坏了我的整个后端,我得到了这个错误:
Proxy error: Could not proxy request /api/user/getuser from localhost:3000 to http://localhost:4000/ (ECONNREFUSED).
在那之后,我的 none 个请求在任何页面上都能正常工作。
这是该请求的 nodejs 代码:
router.get('/uploads/:filename', async (req,res) => {
try {
gfs.files.findOne({filename: req.params.filename}, (err, file) => {
if(!file || file.length === 0) {
return res.status(404).json({message: 'No file exisits'})
}
})
res.status(200).json(file);
} catch (error) {
return res.status(500).json({ message: "Could not find files, please try again" });
}})
接下来是 GridFs 配置:
const conn = mongoose.createConnection(config.get('mongoURI'));
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('uploads');
})
const storage = new GridFsStorage({
url: config.get('mongoURI'),
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(15, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads'
};
resolve(fileInfo);
});
});
}
});
我想我在文档中遗漏了一些重要的东西,我什至没有尝试下载整个图像,我卡住了。非常感谢有用的建议!
我找到了导致错误的问题!在模拟我的请求时,我收到了这个错误:
[0] Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
因此问题出在我的那部分代码中: res.status(200).json(文件);
Nodejs 不允许在发送实际 body 请求后设置状态 header。 所以我必须做的所有修复是:
res.status(200).json(files) to --> res.json(files);
我希望该解决方案对某人有用。