KeystoneJS CloudinaryImage 通过 API 上传
KeystoneJS CloudinaryImage upload via API
似乎缺少有关此主题的文档。我正在尝试上传图像并将其设置为我的 Keystone 模型中的 avatar: { type: Types.CloudinaryImage }
。
我将内容发布为具有以下结构的多部分表单数据: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 中收到的数据。
因此,您需要通过更新处理程序调用 {path}_upload
特殊的,而不是仅仅将头像设置为原始数据(这适用于例如字符串字段) cloudinary image 中的路径。
然后您应该可以执行 avatar.getUpdateHandler
,或许可以执行 this example。
好的,在深入研究了源代码之后,我想出了一个办法:
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
字段。
- 对多部分表单数据字段使用 "magic" 命名您 POST 您的 API:
{field_name}_upload
,在我的案例将是 avatar_upload
.
- process
req.files
,这是一个字典,你的字段名作为键,你的文件数据作为值。 req.body
是空的,因为一些 post-processing 和 multer
。
- 在您的 keystone 模型上调用更新处理程序(您需要先使用
find
获取它)而不是在特定字段上。然后指定 {fields: <>}
以限制其范围,否则您可能会遇到一些问题,例如尝试更新整个对象时出现验证错误。
我想分享对我有用的东西。这个过程有点奇怪,但是通过添加这段代码,所有的模型验证工作都很好,并且设置了云端上传。
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。
似乎缺少有关此主题的文档。我正在尝试上传图像并将其设置为我的 Keystone 模型中的 avatar: { type: Types.CloudinaryImage }
。
我将内容发布为具有以下结构的多部分表单数据: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 中收到的数据。
因此,您需要通过更新处理程序调用 {path}_upload
特殊的,而不是仅仅将头像设置为原始数据(这适用于例如字符串字段) cloudinary image 中的路径。
然后您应该可以执行 avatar.getUpdateHandler
,或许可以执行 this example。
好的,在深入研究了源代码之后,我想出了一个办法:
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
字段。 - 对多部分表单数据字段使用 "magic" 命名您 POST 您的 API:
{field_name}_upload
,在我的案例将是avatar_upload
. - process
req.files
,这是一个字典,你的字段名作为键,你的文件数据作为值。req.body
是空的,因为一些 post-processing 和multer
。 - 在您的 keystone 模型上调用更新处理程序(您需要先使用
find
获取它)而不是在特定字段上。然后指定{fields: <>}
以限制其范围,否则您可能会遇到一些问题,例如尝试更新整个对象时出现验证错误。
我想分享对我有用的东西。这个过程有点奇怪,但是通过添加这段代码,所有的模型验证工作都很好,并且设置了云端上传。
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。