Я хочу загрузить изображения в свою базу данных, используя mon goose -gridfs. но у меня проблемы с этим - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу загрузить изображения, используя mon goose -gridfs. И у меня возникла следующая проблема (та, которую я показываю ниже на фото). Это с использованием mon goose -gridfs, и я хотел бы, чтобы кто-то работал с этой библиотекой и по тому, как я ее структурирую ниже, это поможет мне решить мою ситуацию или обновить меня, если есть более новый способ сделать это, следуя этой же структуре. Заранее спасибо.

Это изображение показывает ошибку, когда я пытаюсь выполнить мой код

Здесь моя модель Вложение

'use strict'

const mongoose = require('mongoose');

const gridfs = require('mongoose-gridfs')({ // TypeError: require(...) is not a function
    collection: 'attachments',
    model: 'Attachment'
});
const AttachmentSchema = gridfs.schema;


module.export = mongoose.model('Attachment', AttachmentSchema);

Здесь моя модель Пользователь, где я передаю Attachment в качестве ссылки на фотографию atributte

'use strict'

require('mongoose-type-email');

const bcrypt = require('bcrypt-nodejs');
const crypto = require('crypto');
const uniqueValidator = require('mongoose-unique-validator');
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
     first_name: {type: String, required: true},
     email: {type: mongoose.SchemaTypes.Email, required: true, unique: true},   
     password: {type: String, required: true},   
     active: {type: Boolean, default: false},
     created: {type: Date, default: Date.now()},
     photo: {type: Schema.ObjectId, ref: "Attachment"},
     valid_token: {type: String},

});

Теперь мой сервис fileService. js, который я использую для загрузки изображений .

'use strict'

const Attachment = require('../models/Attachment');
const im = require('imagemagick');
const fs = require('fs');
const   events = require('events');

const gridfs = require('mongoose-gridfs')({ //TypeError: require(...) is not a function
    collection: 'attachments',
    model: 'Attachment'
});

exports.uploadFile = function (file, cb) {
    const eventEmitter = new events.EventEmitter();
    const lista = Object.values(file);
    const properties = Object.getOwnPropertyNames(file);
    const result = [];
    const listLength = lista.length;

   eventEmitter.once('err', err => {
        cb(err);
   });

   eventEmitter.once('upload', lista => {
      cb(null, lista);
   });

   eventEmitter.on('uploadFinish', (obj, property) => {

       obj.contentType.startsWith("image") ? result.push({
           type: 'img',
           'property': property,
           'value': obj
       }) : result.push({type: 'video', 'property': property, 'value': obj})

       if (listLength == result.length)
           eventEmitter.emit("upload", result);
   });

    lista.length != 0 ? fileWrite(lista, properties, eventEmitter) : eventEmitter.emit("upload");
};

function fileWrite(lista, properties, eventEmitter) {

   const files = Array();
   const Attachment = gridfs.model;

   lista.forEach((element, index) => {
       Attachment.write({
           filename: element.name,
           contentType: element.type
       },
       fs.createReadStream(element.path),
       (err, createdFile) => {
           err ? eventEmitter.emit('err', err) : eventEmitter.emit('uploadFinish', createdFile, 
           properties[index]);
      });
   });
}

Вот мой пользовательский сервис. js, где я вызываю функцию uploadFile файлового сервиса. js service

'use strict'

const User = require('../models/User');
const fileService = require('../services/fileService');

exports.save = function (file, data, res) {
   fileService.uploadFile(file, (err, files) => {
      if (!err) {
        if (files) {
            files.forEach((e) => {
                if (e.property == "photo") {
                    data.photo = e.value;
                }
            });
        }

        data['created'] = new Date();
        const user = new User(data);
        user.save((err, user) => {
            if (!err) {
                user.update(data, (error) => {
                    if (!error) {
                        res.json({success: true, message: "Inserted user", data: user})
                    } else {
                        res.send({
                            success: false,
                            message: 'User cant be updated'
                        });
                    }
                });
            } else
                res.status(500).send({success: false, message: 'Error trying to save the user'});
        });
     } else {
        res.status(500).send({success: false, message: 'Error trying to upload files'});
     }
  });
};

1 Ответ

0 голосов
/ 17 апреля 2020

mon goose -gridfs определяет другой способ его использования здесь :

const { createModel } = require('mongoose-gridfs');

et c.

См. здесь для вашей конкретной ошибки c.

...