Трудно понять gridfs и соединения

Вот я и посмотрел это видео: https://thewikihow.com/video_EVIGIcm7o2w

И это многое объяснило. Но проблема в том, что у меня уже есть проект, созданный с помощью Express, поэтому мое соединение выполняется в app.js следующим образом:

// mongodb connection
var mongoose = require('mongoose');
var config = require('./globals/config');
mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.info(e));

var db = mongoose.connection;
db.once('open', () => {
    console.info('Connected to mongodb. Go to http://localhost:3000 to open app');
});

Теперь я хочу использовать gridFS, в другом файле для загрузки файлов в свою базу данных, и я попробовал это:

var grid = require('gridfs-stream');
var mongoose = require('mongoose');
var fs = require('fs');
uploadFile(file) {
    var config = require('./config');
    mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.info(e));
    var conn = mongoose.connection;
    grid.mongo = mongoose.mongo;
    const gfs = grid(conn.db);
    const writeStream = gfs.createWriteStream({
        filename: file.filename,
    });
    fs.createReadStream(file.path).pipe(writeStream);
    writeStream.on('close', function (file) {
        console.info(`${file.filename} written to the db`);
    });
}

Но в этом нет смысла, так как я заново открываю 2 подключения. Я посмотрел на mongoose-gridfs, но он также показал, что его можно использовать в виде «app.js» без межфайлового способа работы. Как использовать gridfs, не открывая 2 соединения и не используя 2 разных файла js?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте отдельный модуль, скажем, mygridfs.js, и поместите свою функцию в module.exports. Сделайте mongoose параметром этой функции:

var grid = require('gridfs-stream');
var fs = require('fs');
exports.uploadFile = function(file, mongoose) {
    grid.mongo = mongoose.mongo;
    const gfs = grid(mongoose.connection.db);
    const writeStream = gfs.createWriteStream({
        filename: file.filename,
    });
    fs.createReadStream(file.path).pipe(writeStream);
    writeStream.on('close', function (file) {
        console.info(`${file.filename} written to the db`);
    });
}

В вашем основном файле app.js просто потребуйте модуль:

var mygridfs= require("mygridfs");
mygridfs.uploadFile(file, mongoose);

Но мне нужен модуль не из моего файла app.js. Это из другого модуля

Alex Ironside 29.10.2018 17:36

все, что вам нужно сделать, это передать объект мангуста всем модулям, которые в нем нуждаются

mihai 29.10.2018 17:39

Не будет ли такая передача вызывать функцию?

Alex Ironside 29.10.2018 17:41

какая функция? как только соединение установлено, объект инкапсулирует состояние соединения ... не уверен, что вы имеете в виду

mihai 29.10.2018 17:46

uploadFunction - это функция. Как тогда я могу отправить что-то в модуль?

Alex Ironside 29.10.2018 18:06

как я проиллюстрировал ... ваша модель экспортирует функцию F, которая получила параметр мангуста. В F вы должны вызвать uploadFile (файл, мангуст). F вызывается в app.js, где происходит выполнение

mihai 29.10.2018 18:23

Другие вопросы по теме