2017-02-08 3 views
0

Кажется, что документации по этой теме недостаточно. Я пытаюсь загрузить изображение и установить его в avatar: { type: Types.CloudinaryImage } в моей модели Keystone.KeystoneJS CloudinaryImage upload через API

Я публикую информацию как многостраничную форму данных со следующей структурой: avatar: <raw_data>. Вот как я справиться с этим в моем API:

exports.upload_avatar = function(req, res) { 
    if (!req.files.avatar) { 
     console.info('Request body missing'); 
     return res.status(400).json({ message: 'Request body missing', code: 20 }); 
    } 
    req.current_user.avatar = req.files.avatar; 
    req.current_user.save(); 
} 

где current_user является модель мангуста. То, что я сбиваю с толку, - это установить поле типа CloudinaryImage для данных, которые я получаю в API.

ответ

0

Ok после того, как некоторые копаться в исходном коде, я придумал, как сделать это:

exports.upload_avatar = function(req, res) { 
    req.current_user.getUpdateHandler(req).process(req.files, {fields: 'avatar'}, function(err) { 
     if (err) { 
      return res.status(500).json({ message: err.message || '', code: 10 }); 
     } 
     res.send(''); 
    }); 
} 

я имел следующие: подводные камни

  • использовать getUpdateHandler обновить CloudinaryImage поля.
  • использовать «магическое» обозначение для полей данных многостраничной формы, которые вы используете для вашего API: {field_name}_upload, что в моем случае было бы avatar_upload.
  • процесс req.files, который является словарем с вашими именами полей в качестве ключей и данными вашего файла в качестве значений. req.body пуст из-за некоторой постобработки с multer.
  • Вызов обработчика обновлений на вашей трапецеидальной модели (вам нужно сначала взять его с find), а не на определенное поле. Затем укажите {fields: <>}, чтобы ограничить его область действия, в противном случае у вас могут быть некоторые проблемы, такие как ошибки проверки, пытающиеся обновить весь объект.
0

Таким образом, вместо того, чтобы просто настроить аватар на необработанные данные (которые будут работать нормально, например, в поле строки), вам нужно будет пройти через обработчик обновления, который вызывает специальный путь {path}_upload в cloudinary image.

Затем вы должны сделать avatar.getUpdateHandler, возможно, после this example.

+0

Хм, я пробовал 'req.current_user.getUpdateHandler (req) .process (req.files, {fields: 'avatar'}, function (err) {})', а также вызывать обработчик на поле 'avatar '. Не вызывает ошибок, хотя файл также не загружается. –

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