Я хочу загрузить изображения, используя 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'});
}
});
};