环回-如何获取用户ID并插入相关模型中? (有很多)

时间:2018-06-26 16:44:21

标签: node.js rest express loopbackjs

我要弄清楚的是如何获取当前经过身份验证的用户的ID,并在数据库中将记录创建为其他模型的外键时使用该ID?

更具体地说,我需要获取当前经过身份验证的用户(模型:CommonUser)的ID,并在创建新事件时将该ID用作FK。

关系:

我已经基于称为CommonUser的User模型创建了一个Model。普通用户有很多事件。事件属于普通用户。

因此,事件具有名为commonUserId的外键。

如何获取用户ID并在插入时使用该ID?

我本以为在建立关系方面,这将是过程的一部分自动进行吗?那不对吗?

也使事情复杂化的是,我有一个事件查找表(我会担心下一个表,因此不必深究),因为事件通过事件查找还具有AndBelongsToMany。

用户

{
  "name": "CommonUser",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {
    "events": {
      "type": "hasMany",
      "model": "Event",
      "foreignKey": "eventId",
      "through": "EventLookUp"
    },
    "friends": {
      "type": "hasMany",
      "model": "CommonUser",
      "through": "Friend",
      "foreignKey": "friendId"
    }
  },
  "acls": [],
  "methods": {}
}

User

事件

{
  "name": "Event",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "name": {
      "type": "string"
    },
    "radius": {
      "type": "number",
      "default": 50
    },
    "status": {
      "type": "number"
    },
    "location": {
      "type": "geopoint",
      "required": true
    }
  },
  "validations": [],
  "relations": {
    "owner": {
      "type": "belongsTo",
      "model": "CommonUser",
      "foreignKey": "commonUserId"
    },
    "commonUsers": {
      "type": "hasAndBelongsToMany",
      "model": "CommonUser",
      "foreignKey": "ownerId",
      "through": "EventLookUp"
    },
    "galleries": {
      "type": "hasOne",
      "model": "Gallery",
      "foreignKey": ""
    },
    "photos": {
      "type": "hasMany",
      "model": "Photo",
      "foreignKey": "",
      "through": "Gallery"
    }
  },
  "acls": [],
  "methods": {}
}

Event

事件查找

{
  "name": "EventLookUp",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": {}
}

Event LookUp

如果能指出正确的方向,那就太好了。阅读文档很难找到答案。 我认为我需要在插入并设置事件模型属性之前使用操作挂钩?就此而言,回送的最佳实践是什么?

2 个答案:

答案 0 :(得分:4)

在使用环回默认用户/登录api以用户身份登录时,在环回swagger中,您将获得访问令牌对象作为响应。您可以复制访问令牌的ID并粘贴到swagger右上角的框中并设置访问令牌。因此,在内部将您的访问令牌设置为环回,并且对于来自swagger的每个请求,环回都会将访问令牌与请求一起添加。这样,您可以在远程方法中从ctx(context)获取访问令牌。

要进行创建或查找或创建,请保存事件obj:

Event.observe('before save', function updateUserId(ctx, next) {

  let userId = ctx.options.accessToken.userId;`

  if (ctx.instance) {
    ctx.instance.commonUserId = userId;
  }
  next();
});

对于事件obj的updateAttributes:

Event.observe('before save', function updateUserId(ctx, next) { 

  let userId = ctx.options.accessToken.userId; 

  if (ctx.currentInstance) { 
    ctx.currentInstance.commonUserId = userId;
  } 
  next(); 
});

答案 1 :(得分:0)

我找到了解决方案,但是我不确定这是最佳实践还是有更好的处理方法。

无论如何,我都在“ /common/models/event.js”内部创建了一个操作钩子,看来您可以在此钩子中访问上下文。

如果有更好的方法,我想知道。

'use strict';
module.exports = function (Event) {


    Event.observe('before save', function updateForeignKeyCommonUserId(ctx, next) {

        // console.log(ctx.options);
        /* WHAT Options Looks Like */
        // { accessToken:
        // { id: 'Z20R1RsnumWEdDzR3TyCCbmZ0DTp4tOh2cviU6JGsrlNIYCs3KchQ7mdAnhTc1VQ',
        //     ttl: 1209600,
        //     created: 2018-06-26T17:41:28.298Z,
        //     userId: 3 },
        // authorizedRoles: {} }
        // console.log("THE USER ID IS: ");
        // console.log(ctx.options.accessToken.userId); // Current User Id

        var userId = ctx.options.accessToken.userId;

        // So appearently "the context provides either an instance property or a pair of data and where properties"
       // @todo: find out why there can be a 'instance' or 'data'. 
        if (ctx.instance) {
            ctx.instance.commonUserId = userId; // instance
        } else {
            ctx.data.commonUserId = userId; // data
        }
        next();
    });

};

如果有人不介意解释上下文的来源以及如何填充上下文,那将非常棒!