我正在尝试制作自己的上传服务,并且我希望能够在我的服务器上的本地文件夹中以及我的 mongoDB 云服务(Atlas)上上传文件。
到目前为止,我已经分别完成了这两项服务,并且它们工作正常(我制作了一个用于将文件上传到 mongo Atlas 的 Node 应用程序,以及另一个用于将文件上传到服务器的 Node 应用程序)。但现在,我想将这两个应用程序统一到一个 Node 应用程序中,在每个 POST 请求之后,文件都会发送到 Atlas 以及本地文件夹。我正在使用 multer 和 gridfs。
第一次尝试是在我的index.html文件上创建两个“文件输入”字段,每个字段都有两个不同的POST请求:一个到'/upload',它将文件发送到Atlas,第二个到'/uploaddisk' 将文件发送到磁盘。但是,第二个发布请求不起作用(每次我想提交文件时它都会抛出错误)。将文件上传到 mongoDB 似乎每次都工作得很好。
有什么想法可以在单个 POST 上执行此操作吗?预先感谢您!
这是我为 server.js
应用程序编写的代码:
//mongo DATA
const dbURI =
"myc-atlas-credentials";
mongoose.Promise = global.Promise;
// mongoose.connect(bdURI, { useNewUrlParser: true, useUnifiedTopology: true });
const conn = mongoose.createConnection(dbURI, {
useNewUrlParser: true,
useUnifiedTopology: true
});
//init gfs
let gfs;
conn.once("open", () => {
//initialize the stream
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection("uploads");
});
//creating the storage engine for MONGO
const storage = new GridFsStorage({
url: dbURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
const filename = file.fieldname + '-' + Date.now() + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: "uploads"
};
resolve(fileInfo);
});
}
});
const upload = multer({ storage: storage });
//set storage engine with multer for disk
const diskstorage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, path.join(__dirname + '/uploads/'));
},
filename: function(req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}
});
const diskupload = multer({ storage: diskstorage });
//route for POST - upload data to mongo
app.post('/upload', upload.single('file'), (req, res) => {
console.log({ file: req.file });
// res.json({ file: req.file });
res.redirect('/');
});
//route for POST - upload data to disk
app.post('/uploaddisk', diskupload.single('file'), (req, res, next) => {
const file = { file: req.file };
if (!file) {
const error = new Error('Please upload a file');
error.httpStatusCode = 400;
return next(error);
}
res.redirect('/');
});
你可以这样尝试:
function fileUpload(req, res, next) {
upload.single('file')(req, res, next);
diskupload.single('file')(req, res, next);
next();
}
//route for POST - upload data to mongo
app.post('/upload', fileUpload, (req, res) => {
console.log({ file: req.file });
// res.json({ file: req.file });
res.redirect('/');
});
我是一名优秀的程序员,十分优秀!