我要弄清楚的是如何获取当前经过身份验证的用户的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": {}
}
事件
{
"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": {}
}
事件查找
{
"name": "EventLookUp",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {},
"validations": [],
"relations": {},
"acls": [],
"methods": {}
}
如果能指出正确的方向,那就太好了。阅读文档很难找到答案。 我认为我需要在插入并设置事件模型属性之前使用操作挂钩?就此而言,回送的最佳实践是什么?
答案 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();
});
};
如果有人不介意解释上下文的来源以及如何填充上下文,那将非常棒!