Загрузка 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.