Как загрузить файл в mongoDB с маршрута? - PullRequest
0 голосов
/ 08 января 2020

Извините за такой базовый c вопрос, но я действительно изо всех сил пытался найти решение в другом месте онлайн, и я пытаюсь изучить стек MERN. Я пытаюсь загрузить файл на mongodb и на моем сервере. js file следующий код загружает файл, как и ожидалось. Я могу видеть детали файла в БД. Но когда я пытаюсь переместить это в маршрут, чтобы он не был в моем файле сервера, он терпит неудачу. Мой главный вопрос: как я могу взять следующее и добавить его в router.post('/fileupload'...) как его собственный. 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');
    }

Как получить доступ к маршруту с моего сервера. js:

const fileupload = require("./routes/api/fileupload");
app.use("/api/fileupload", fileupload)

1 Ответ

1 голос
/ 08 января 2020

Вы можете сделать что-то вроде этого -

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 вам нужно предоставить модель в пн go для Для хранения данных вы можете указать пустую модель или добавить несколько пользовательских полей, которые будут частью коллекции mon go, с некоторыми дополнительными полями, которые добавляет 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);

...