2015-04-25 4 views
2

Я создаю RESTful API, используя Node + Express 4 + MongoDB + Mongoose.Как сохранить файл с помощью Mongoose-Crate через экспресс-маршрут

Одна вещь, которую должен выполнить мой API, - это хранить и извлекать файлы. Что я буду хранить в Amazon S3. У Mongoose есть специальный плагин для прикрепления файлов к файлам Mongo под названием Mongoose-Crate, который, в свою очередь, имеет поставщика Mongoose-Crate-S3, который загружает файлы на S3.

Я приложил все усилия, чтобы адаптировать код примера с страницы Mongmose-Crate-S3 npm для работы в качестве экспресс-маршрута, но до сих пор я не получил изображение для успешной загрузки в хранилище S3. Документы моей модели «файл» создаются в моей базе данных mongo, но имеют только поля «_id» и «__v». No 'title', no 'description', ничего не указывает, что конечная точка .post фактически получает файлы, которые я пытаюсь опубликовать. Я постоянно вношу изменения в свой код, но обычно получаю некоторые изменения: «Не удалось получить ответ».

Вот мой мангуст file.js схемы (с моими учетными данными S4 удален конечно)

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var crate = require('mongoose-crate'); 
var S3 = require('mongoose-crate-s3'); 

var FileSchema = new Schema({ 
    title: String, 
    description: String 
}); 

FileSchema.plugin(crate, { 
    storage: new S3({ 
     key: '<api-key-here>', 
     secret: '<secret-here>', 
     bucket: '<bucket-here>', 
     acl: '<acl-here>', // defaults to public-read 
     region: '<region-here>', // defaults to us-standard 
     path: function(attachment) { // where the file is stored in the bucket - defaults to this function 
      return '/' + path.basename(attachment.path) 
     } 
    }), 
    fields: { 
     file: {} 
    } 
}); 

module.exports = mongoose.model('File', FileSchema); 

А вот соответствующий фрагмент моего файла API маршрутов. Я довольно уверен, что код, который мне нужно исправить, здесь.

apiRouter.route('/files') 

     .post(function(req, res){ 

      var file = new File() 

      //.attach = function(field, attachment, callback) 
      file.attach('image', req.body, function(error) { 
       // file is now uploaded and post.file is populated e.g.: 
       // post.file.url 
      }) 

     }) 

     .get(function(req, res){ 
      //get a list of all files goes here 
     }); 

Я ожидаю, что я что-то очевидное отсутствую, но MEAN стек программирование является новым для меня, и я рыскал StackOverflow & полотна в целом ищу больше примеров или что-нибудь намек на то, что мне не хватает. Пожалуйста помоги!

ответ

6

Прежде всего, вы должны указать путь своего местоположения, где вы хотите сохранить файл на S3, в настоящее время в этом примере он использует тот же путь, что и исходный файл (который может быть /var/tmp/y7sday...10 или C:/Users/SomeGuy/Pictures/..), поэтому нам необходимо сначала разобрать это.

В моем коде я использую то же имя, что и файл, который они дали, в процессе производства вы можете отсортировать их по дате и добавить к ним случайный uuid. full example

FileSchema.plugin(crate, { 
    storage: new S3({ 
     key: process.env.KEY, 
     secret: process.env.SECRET, 
     bucket: process.env.BUCKET, 
     acl: 'public-read', // defaults to public-read 
     region: 'eu-west-1', // defaults to us-standard 
     path: function(attachment) { // where the file is stored in the bucket - defaults to this function 
      return '/' + attachment.name 
     } 
    }), 
    fields: { 
     file: {} 
    } 
}); 

Следующая в вашем API конечной точке вы хотите включить какую-либо информацию формы в организме и добавить их к объекту, они будут находиться в req.body части.

Самое главное отметить, что я установил приложение как file, это должно соответствовать полю, которое вы указали в вашей схеме мангуста, или оно умрет.

Далее включают req.files.file в качестве второго аргумента. full example

exports.create = function (req, res) { 
    var file = new File(); 
    file.title = req.body.title; 
    file.description = req.body.description; 
    file.attach('file', req.files.file, function (error) { 
     if (error) { 
      return res.send(error); 
     } else { 
      return res.send(file); 
     } 
    }); 
}; 

Я загрузил свои разработки в GitHub, поэтому, пожалуйста, клонировать, что и попробовать его.

Все, что вам нужно сделать, это POST к/файлу/

{ 
    "description": "My Description", 
    "title": "My Title", 
    "file": { 
     "url": "https://mysecretbucket.s3-eu-west-1.amazonaws.com/bb4bf9f69bf41ab478824d80a338beb6.png", 
     "type": "image/png", 
     "name": "bb4bf9f69bf41ab478824d80a338beb6.png", 
     "size": 8912 
    }, 
    "_id": "553e8ed8282cc30000000001" 
} 

Убедитесь, что вы установите поле в форме, чтобы быть file как на картинке ниже

enter image description here

+0

Здесь это схема файлов https://github.com/eknowles/mongoose-crate-example/blob/master/app/models/file.js и api https://github.com/eknowles/mongoose-crate -example/blob/master/app/controllerlers/file.js # L30-L46 –

+1

Удивительно! Большое спасибо за усилия, которые вы вложили в ответ на это. Это имеет большое значение для того, чтобы помочь мне понять выраженную маршрутизацию в целом. Я твой должник. Стек говорит, что я должен ждать 20 часов, прежде чем награждать щедрость, но будьте уверены, что это ваше! – metaColin

+0

Не беспокойтесь! Экспресс - потрясающая каркас, множество действительно замечательных вещей! –

Смежные вопросы