Loopbackjs 在环回上,如何在使用从访问令牌获得的用户id时执行Upsert事件?
假设您有两个表:Loopbackjs 在环回上,如何在使用从访问令牌获得的用户id时执行Upsert事件?,loopbackjs,strongloop,Loopbackjs,Strongloop,假设您有两个表:CARS和voces 现在你想让你的用户在车里投票。他们可以投票给一辆新车,也可以改变以前的投票,但是没有一个用户可以投票给同一辆车两次 VOTE-MODEL car_id user_id vote_value 您将如何为该模型设置Upsert过程?请记住,Upsert方法不接受远程挂钩(保存前),这将阻止您从访问令牌获取用户id 以下是我尝试过但不起作用的一些方法: 尝试1 尝试2 这两次尝试的问题是,似乎无法为Upsert或Udpate执行代码。它被命名为操作钩子
CARS
和voces
现在你想让你的用户在车里投票。他们可以投票给一辆新车,也可以改变以前的投票,但是没有一个用户可以投票给同一辆车两次
VOTE-MODEL
car_id
user_id
vote_value
您将如何为该模型设置Upsert过程?请记住,Upsert方法不接受远程挂钩(保存前),这将阻止您从访问令牌获取用户id
以下是我尝试过但不起作用的一些方法: 尝试1
尝试2
这两次尝试的问题是,似乎无法为Upsert或Udpate执行代码。它被命名为操作钩子而不是远程钩子 顺便说一句,你的第一次尝试应该是这样的:
module.exports = function (Votes) {
Votes.observe('before save', function setAutoData(context, next) {
if (context.instance) {
if (context.isNewInstance) {
if (context.options.accessToken) {
context.instance.user_id = context.options.accessToken.userId;
}
return next();
}else {
Votes.count({
where: {
car_id: context.instance.car_id,
user_id: context.instance.user_id,
vote_value: context.instance.vote_value
}
}, function(err, count){
if(err) return next(err);
if(count > 0) next(SuitableError);
next();
});
}
}
});
};
您只需修改用户id,就可以完成操作。无需进行额外的更新/升级
如果这不是新实例,请检查以前使用相同条件的投票,如果存在,请拒绝,否则请允许
还有一个简单的解决方案,不需要挂钩
Votes.vote = function(data, options, cb){
var userId = options && options.accessToken && options.accessToken.userId;
if(!userId){
return cb(UserNotFound); //return error
}
Votes.upsertWithWhere({
car_id: data.car_id,
user_id: userId
}, {
car_id: data.car_id,
user_id: userId,
vote_value: data.vote_value
}, function(err, result){
if(err) return cb(err);
cb(null, result);
});
};
Votes.remoteMethod('vote', {
accepts: [
{
arg: 'data',
type: 'Object',
required: true,
http: {source: 'body'}
},
{
arg: 'options',
type: 'Object',
http: "optionsFromRequest"
}
],
returns: {root: true, type: 'object'},
http: {verb: 'post', status: 201, path: '/vote'}
});
嗨,易卜拉欣,谢谢你!我相信你的第二个建议正是我所需要的。但是我该如何实现呢?仅供参考:您的第一个代码可以工作,但不会更新投票。换句话说,检查每个发送的POST以查看另一条记录是否已经具有相同的car_id和user_id组合是很重要的,如果是,则该记录应使用新值更新字段vote_值。这就是为什么我相信我所需要的东西在哪里。您可以按原样使用我的第二个代码。只是
UserNotFound
没有实现,当然我尝试过了。但它并没有被执行。我把console.log放得到处都是,但它只在代码前后打印。@Fabionalasco它是服务本身,而不是任何挂钩。您需要将其定义为远程方法。
module.exports = function (Votes) {
Votes.observe('before save', function setAutoData(context, next) {
if (context.instance) {
if (context.isNewInstance) {
if (context.options.accessToken) {
context.instance.user_id = context.options.accessToken.userId;
}
return next();
}else {
Votes.count({
where: {
car_id: context.instance.car_id,
user_id: context.instance.user_id,
vote_value: context.instance.vote_value
}
}, function(err, count){
if(err) return next(err);
if(count > 0) next(SuitableError);
next();
});
}
}
});
};
Votes.vote = function(data, options, cb){
var userId = options && options.accessToken && options.accessToken.userId;
if(!userId){
return cb(UserNotFound); //return error
}
Votes.upsertWithWhere({
car_id: data.car_id,
user_id: userId
}, {
car_id: data.car_id,
user_id: userId,
vote_value: data.vote_value
}, function(err, result){
if(err) return cb(err);
cb(null, result);
});
};
Votes.remoteMethod('vote', {
accepts: [
{
arg: 'data',
type: 'Object',
required: true,
http: {source: 'body'}
},
{
arg: 'options',
type: 'Object',
http: "optionsFromRequest"
}
],
returns: {root: true, type: 'object'},
http: {verb: 'post', status: 201, path: '/vote'}
});