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'}
  });