Загрузка KeystoneJS CloudinaryImage через API

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

Я публикую контент в виде составных данных со следующей структурой: 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.

3 ответа

Решение

Хорошо, после того, как я покопался в исходном коде, я нашел способ сделать это:

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: <>} чтобы ограничить его область, в противном случае могут возникнуть некоторые проблемы, такие как ошибки проверки при попытке обновить весь объект.

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

Вы должны быть в состоянии сделать avatar.getUpdateHandlerВозможно, следуя этому примеру.

Я хотел бы поделиться тем, что работает для меня. Процесс довольно странный, но, добавив в этот код, все проверки моделей работают просто отлично, и установлены облачные загрузки.

post(req, res, next) {
  const newBundle = new Bundle(); //A mongoose model
  newBundle.getUpdateHandler(req).process(req.body, (err) => {
    if (err) {
      return res.status(500).json({
        error: err.message,
      });
    }
    return res.json(newBundle);
  });
}

При публикации в конечную точку все, что вам нужно сделать, это убедиться, что вы установили в полях вашего файла значение {databaseFieldName}_upload.

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