如何从路由上传文件到 mongoDB?
How to upload file to mongoDB from a route?
很抱歉提出这样一个基本问题,但我真的很难在网上其他地方找到解决方案,而且我正在努力学习 MERN 堆栈。我正在尝试将文件上传到 mongodb,在我的 server.js 文件中,以下代码按预期上传文件。我可以在数据库中看到文件的详细信息。但是当我试图将它移动到一条路由中时,它不在我的服务器文件中,它失败了。我的主要问题是如何获取以下内容并将其添加到 router.post('/fileupload'...)
作为我的 routes 文件夹中自己的 .js 文件,以便它上传到我的数据库。谢谢!
var conn = mongoose.connection;
if (conn !== "undefined") {
var grid = require("gridfs-stream");
var fs = require("fs");
grid.mongo = mongoose.mongo;
conn.once("open", () => {
console.log("conn open");
var gridfs = grid(conn.db);
var streamwrite = gridfs.createWriteStream({
filename: "tmp.txt"
});
fs.createReadStream("tmp2.txt").pipe(streamwrite);
streamwrite.on("close", function (file) {
console.log("Write written successfully in database");
});
});
} else {
console.log('sorry not connected');
}
我如何从 server.js 访问路线:
const fileupload = require("./routes/api/fileupload");
app.use("/api/fileupload", fileupload)
你可以这样做 -
uploadRoute.js
// Config
const config = require('../../../config/config');
// Logic
const mongoose = require("mongoose");
const fs = require('fs');
const Grid = require('gridfs-stream');
//models
const Files = require('../../../models/files.model');
module.exports = router => {
const conn = mongoose.connection;
Grid.mongo = mongoose.mongo;
let gfs;
conn.once("open", () => {
gfs = Grid(conn.db);
router.post('/bucket/upload', (req, res) => {
let {
file
} = req.files;
let writeStream = gfs.createWriteStream({
filename: `${file.name}`,
mode: 'w',
content_type: file.mimetype
});
writeStream.on('close', function (uploadedFile) {
Files.create({
doc_id: uploadedFile._id,
length: uploadedFile.length,
name: uploadedFile.filename,
type: uploadedFile.contentType
})
.then(file => res.json({
success: true,
message: "File was saved with success"
}))
.catch(err => {
console.error(`[*] Error, while uploading new files, with error: ${err}`);
res.status(500).json({
message: `[*] Error while uploading new files, with error: ${err}`
})
})
});
writeStream.write(file.data);
writeStream.end();
});
});
}
对于 gridfs,您需要在 mongo 中提供一个模型来存储数据,您可以提供空白模型或添加一些自定义字段,这些字段将成为 mongo 集合的一部分,以及一些额外的字段,gridfs添加。
models.js
const mongoose = require('mongoose');
const fileSchema = new mongoose.Schema({
doc_id: {
type: String
},
length : {
type: Number
},
name: {
type: String
},
type: {
type: String
}
});
module.exports = mongoose.model('File', fileSchema);
很抱歉提出这样一个基本问题,但我真的很难在网上其他地方找到解决方案,而且我正在努力学习 MERN 堆栈。我正在尝试将文件上传到 mongodb,在我的 server.js 文件中,以下代码按预期上传文件。我可以在数据库中看到文件的详细信息。但是当我试图将它移动到一条路由中时,它不在我的服务器文件中,它失败了。我的主要问题是如何获取以下内容并将其添加到 router.post('/fileupload'...)
作为我的 routes 文件夹中自己的 .js 文件,以便它上传到我的数据库。谢谢!
var conn = mongoose.connection;
if (conn !== "undefined") {
var grid = require("gridfs-stream");
var fs = require("fs");
grid.mongo = mongoose.mongo;
conn.once("open", () => {
console.log("conn open");
var gridfs = grid(conn.db);
var streamwrite = gridfs.createWriteStream({
filename: "tmp.txt"
});
fs.createReadStream("tmp2.txt").pipe(streamwrite);
streamwrite.on("close", function (file) {
console.log("Write written successfully in database");
});
});
} else {
console.log('sorry not connected');
}
我如何从 server.js 访问路线:
const fileupload = require("./routes/api/fileupload");
app.use("/api/fileupload", fileupload)
你可以这样做 -
uploadRoute.js
// Config
const config = require('../../../config/config');
// Logic
const mongoose = require("mongoose");
const fs = require('fs');
const Grid = require('gridfs-stream');
//models
const Files = require('../../../models/files.model');
module.exports = router => {
const conn = mongoose.connection;
Grid.mongo = mongoose.mongo;
let gfs;
conn.once("open", () => {
gfs = Grid(conn.db);
router.post('/bucket/upload', (req, res) => {
let {
file
} = req.files;
let writeStream = gfs.createWriteStream({
filename: `${file.name}`,
mode: 'w',
content_type: file.mimetype
});
writeStream.on('close', function (uploadedFile) {
Files.create({
doc_id: uploadedFile._id,
length: uploadedFile.length,
name: uploadedFile.filename,
type: uploadedFile.contentType
})
.then(file => res.json({
success: true,
message: "File was saved with success"
}))
.catch(err => {
console.error(`[*] Error, while uploading new files, with error: ${err}`);
res.status(500).json({
message: `[*] Error while uploading new files, with error: ${err}`
})
})
});
writeStream.write(file.data);
writeStream.end();
});
});
}
对于 gridfs,您需要在 mongo 中提供一个模型来存储数据,您可以提供空白模型或添加一些自定义字段,这些字段将成为 mongo 集合的一部分,以及一些额外的字段,gridfs添加。
models.js
const mongoose = require('mongoose');
const fileSchema = new mongoose.Schema({
doc_id: {
type: String
},
length : {
type: Number
},
name: {
type: String
},
type: {
type: String
}
});
module.exports = mongoose.model('File', fileSchema);