如何从路由上传文件到 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);