首页 > 解决方案 > 如何在 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 密钥。

标签: typescriptloopbackjs

解决方案


只是我自己的问题的答案,以防有人想尝试类似的结果。

我没有正确使用 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 } })
    })
  }

推荐阅读