typescript - 如何在 Loopback4/Typescript 中对 API 密钥进行额外查找后,根据父 ID 强制进行数据过滤
问题描述
我对 Typescript 和 loopback(lb4) 有点菜鸟,我正处于一个难点,我正在拉扯我的头发,我希望社区能够提供帮助。我正在尝试根据针对数据库记录的 API 密钥完成对记录 ID 的查找,因此我可以将此记录用作外键,以从另一个数据库表派生另一组结果。我正在使用预先存在的数据库
错误显示如下。
loopback:connector:mssql 结果:null {"recordsets":[[]],"recordset":[],"output":{},"rowsAffected":[0]} +302ms /Users/bloop/Desktop/AngularTestFolder /ZaharaReporting/zaharareporting/dist/controllers/tenancy.controller.js:27 返回 object.tenancyid.valueOf;^
TypeError:无法读取 null 的属性“tenancyid”
我已经尝试了很多事情,并怀疑这是对 typescript 或 loopback4 的一些基础知识缺乏理解,所以如果是这种情况,我深表歉意,我只是发现自己正在思考如何绕过它的相同想法,所以我觉得需要有人指出我为什么以及如何变得愚蠢。
我试图让端点/api/{apikey}/GetSpecificBusinessunit
' 工作。但我得到 `FindTenancyID.IdOnly' 以未定义的形式返回
import {
repository,
} from '@loopback/repository';
import {
param,
get,
} from '@loopback/rest';
import { Tenancy, Businessunit } from '../models';
import { TenancyRepository, BusinessunitRepository } from '../repositories';
class TenancyHelper {
constructor(@repository(TenancyRepository)
public tenancyRepository: TenancyRepository) { }
// Query filter tenancy to get Id only
async idOnly(api: String) {
return await this.tenancyRepository.findOne(
{ where: { apikey: api }, fields: { tenancyid: true }, limit: 1 },
function (err: any, object: Tenancy) {
//console.log("TenancyId was " + object.tenancyid);
return object.tenancyid.valueOf;
}).catch(a => console.log(a));
}
}
export class TenancyController {
constructor(
@repository(TenancyRepository)
public tenancyRepository: TenancyRepository,
@repository(BusinessunitRepository)
public businessunitRepository: BusinessunitRepository,
) { }
@get('/api/{apikey}/GetSpecificBusinessunit', {
responses: {
'200': {
description: 'Get BusinessUnit by API Key',
content: { 'application/json': { schema: { 'x-ts-type': Businessunit } } },
},
},
})
async GetBusinessunit(
@param.path.string('apikey') Apikey: String,
FindTenancyId = new TenancyHelper(this.tenancyRepository),
): Promise<Businessunit[]> {
return new Promise<Number>(function (resolve, reject) {
Number(FindTenancyId.idOnly(Apikey));
})
.then(a => {
console.log("This was the excecuted: " + a);
return this.businessunitRepository.find(
{ where: { tenancyid: a } })
})
}
我期望一个 JSON 对象返回所有业务单位,并在要返回的路径中定义此租户 API 密钥。
解决方案
只是我自己的问题的答案,以防有人想尝试类似的结果。
我没有正确使用 Promise(可能还没有),但这对我来说是正确的。
@get('/api/{apikey}/GetBusinessunits', {
responses: {
'200': {
description: 'Get BusinessUnits for API Key',
content: { 'application/json': { schema: { 'x-ts-type': Businessunit } } },
},
},
})
async GetBusinessunit(
@param.path.string('apikey') Apikey: String
): Promise<Businessunit[]> {
return await this.tenancyRepository.findOne(
{ where: { apikey: Apikey }, fields: { tenancyid: true }, limit: 1 }
).then((a) => {
let id = -1;
if (a !== null) {
id = Number(a!.tenancyid);
}
return this.businessunitRepository.find(
{ where: { tenancyid: id } })
})
}
推荐阅读
- maven - 使用 Maven 执行 jmeter 测试时出现错误“您必须指定有效的生命周期阶段或格式中的目标”
- flutter - Flutter:OutlineButton的side属性好像没有效果
- ubuntu - NGINX 在图像上返回 404
- java - 在 JUnit4 中使用 assertThat
- html - 使用lazyload重新加载页面时如何隐藏图像的alt标签?
- haskell - 了解递归函数列表中的列表 - haskell
- django - 如何在 Django 中使用基于类的 UpdateView 返回过滤页面
- php - MS SQL 和 PHP 回显浮点数
- r - 按条件最小归一化
- google-api - 停用 JSON-RPC 和 Global HTTP Batch 端点后的 Google API .NET 客户端的安全版本