异步REST PATCH最佳做法

时间:2018-07-18 12:25:29

标签: node.js express asynchronous callback promise

我有一个rest api,它接收带有以下可能参数的补丁请求:

  • 名字
  • 姓氏
  • 图片
  • 生日

如果接收到图像参数,则需要将图像上传到CDN,然后再更新并保存用户个人资料。 如果没有收到图像参数,我将更新并保存用户个人资料。

我想到的是: 如果是照片,则上传->许诺->更新字段->保存 否则更新字段->保存

我的问题:是否有最佳实践,因此我不需要为每种情况加倍代码部分?

app.patch('/users', authenticate, (req, res) => {
  let body = _.pick(req.body, ['birthday', 'country', 'city', 'gender', 'firstname', 'lastname', 'photo']);

  if ( body.photo ){
    cloudinary.uploader.upload(body.photo,function(error, result) {
      if( error ) {
        res.status(400).send(error);
      }
      body.photo = result.url;
      req.user = { ... req.user, ... body};
      console.log ('update profile');
      res.send(req.user);
    });
  }

  req.user = { ... req.user, ... body};
  console.log ('update profile');
  res.send(req.user);
});

1 个答案:

答案 0 :(得分:1)

我假设有一个createUser函数可以返回承诺。

let userData = req.body;
userData.photo = undefined;

return Promise.resolve()
    .then(function() {
        if (req.body.photo) {
            return promisifiedUpload(body.photo);
        } else {
            return undefined;
        }
    })
    .then(function(result) {
        if (result && result.url) {
            userData.photo = result.url;
        }

        return createUser(userData);        
    })
    .then(function(it) {
        res.send(it);
    })
    .catch(function(err) {
        res.status(400).send(err);
    });

有很多帮助程序库可以帮助您将与function(err, resp){...}之类的节点样式回调一起使用的函数转换为Promise,但是为了清楚起见,这是您可以使用的一种方法:

function promisifiedUpload(url) {
    return new Promise(function(resolve, reject) {
        cloudinary.uploader.uproad(url, function(err, resp) {
            if (err) {
                reject(err);
            } else {
                resolve(resp);
            }
        });
    });
}

一些可能派上用场的材料: