Node.js KeystoneJS CloudinaryImage通过API上传

Node.js KeystoneJS CloudinaryImage通过API上传,node.js,mongoose,cloudinary,keystonejs,Node.js,Mongoose,Cloudinary,Keystonejs,似乎缺少关于这个主题的文档。我正在尝试上传一个图像,并在我的Keystone模型中将其设置为avatar:{type:Types.CloudinaryImage} 我将内容发布为具有以下结构的多部分表单数据:avatar:。以下是我在API中处理此问题的方法: exports.upload_avatar = function(req, res) { if (!req.files.avatar) { console.info('Request body missing');

似乎缺少关于这个主题的文档。我正在尝试上传一个图像,并在我的Keystone模型中将其设置为
avatar:{type:Types.CloudinaryImage}

我将内容发布为具有以下结构的多部分表单数据:
avatar:
。以下是我在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();
} 

其中,
当前用户
是猫鼬模型。我感到困惑的是如何将我的
CloudinaryImage
type字段设置为我在API中接收的数据

因此,除了将头像设置为原始数据(例如字符串字段),您还需要通过更新处理程序,它调用中的
{path}\u upload
特殊路径


然后,您应该能够执行
avatar.getUpdateHandler
,也许可以执行以下操作

好的,在深入研究了源代码之后,我找到了一种方法:

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

我想与大家分享我的工作经验。这个过程有点奇怪,但是通过添加这段代码,所有的模型验证都可以正常工作,并且可以通过cloudinary上传

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}\u upload

嗯,我尝试了
req.current_user.getUpdateHandler(req.process)(req.files,{fields:'avatar'},function(err){})
,以及调用
avatar
字段上的处理程序。不会导致任何错误,尽管文件也未上载。