【问题标题】:KeystoneJS CloudinaryImage upload via APIKeystoneJS CloudinaryImage 通过 API 上传
【发布时间】:2017-06-26 02:40:34
【问题描述】:

似乎缺乏有关此主题的文档。我正在尝试上传一张图片并在我的 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 中收到的数据。

【问题讨论】:

    标签: node.js mongoose cloudinary keystonejs


    【解决方案1】:

    因此,您需要通过更新处理程序调用@987654321 中的{path}_upload 特殊路径,而不仅仅是将头像设置为原始数据(这对于例如字符串字段来说可以正常工作) @。

    然后你应该可以做avatar.getUpdateHandler,也许跟随this example

    【讨论】:

    • 嗯,我试过req.current_user.getUpdateHandler(req).process(req.files, {fields: 'avatar'}, function(err) {}),以及在avatar 字段上调用处理程序。不会导致任何错误,虽然文件也没有上传。
    【解决方案2】:

    好吧,在研究了源代码之后,我想出了一个办法:

    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,它是一个字典,其中您的字段名称作为键,您的文件数据作为值。由于multer 进行了一些后期处理,req.body 为空。
    • 在你的 keystone 模型上调用更新处理程序(你需要先用find 获取它)而不是在特定字段上。然后指定{fields: <>} 以限制其范围,否则您可能会遇到一些问题,例如尝试更新整个对象的验证错误。

    【讨论】:

      【解决方案3】:

      我想分享对我有用的方法。这个过程有点奇怪,但是通过添加这段代码,所有的模型验证都可以正常工作,并且设置了云端上传。

      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。

      【讨论】:

        猜你喜欢
        • 2015-01-04
        • 2016-09-20
        • 2021-07-22
        • 2015-01-26
        • 2022-01-10
        • 1970-01-01
        • 2011-10-18
        • 2014-09-27
        • 2021-10-19
        相关资源
        最近更新 更多