我有一个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);
});
答案 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);
}
});
});
}
一些可能派上用场的材料: