KeystoneJS通过API上传CloudinaryImage

时间:2017-02-08 12:57:40

标签: node.js mongoose cloudinary keystonejs

似乎缺乏关于此主题的文档。我正在尝试上传图片并将其设置为我的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中收到的数据。

3 个答案:

答案 0 :(得分:0)

因此,不仅仅是将头像设置为原始数据(对于例如字符串字段也可以正常工作),您需要通过更新处理程序,该处理程序调用{​​{1}}特殊路径cloudinary image

然后,您应该可以执行{path}_upload,也许可以执行this example

答案 1 :(得分:0)

在对源代码进行一些挖掘之后,我找到了一种方法:

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字段。
  • 对POST到API的多部分表单数据字段使用“魔术”命名: {field_name}_upload ,在我的情况下为avatar_upload
  • 进程req.files,这是一个字段,其字段名称为键,文件数据为值。由于使用req.body进行了一些后处​​理,multer为空。
  • 在您的keystone模型上调用更新处理程序(您需要先使用find获取它)而不是在特定字段上。然后指定{fields: <>}来限制其范围,否则您可能会遇到一些问题,例如尝试更新整个对象的验证错误。

答案 2 :(得分:0)

我想分享对我有用的东西。这个过程有点奇怪,但是通过添加此代码,所有模型验证工作都很好,并且设置了云上传。

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。