开发者问题收集

在 Loopback4/Typescript 中对 API 密钥进行额外查找后,如何根据父 ID 强制进行数据过滤

2019-06-03
95

我对 Typescript 和 loopback(lb4) 有点陌生,现在正处于一个瓶颈,我有点抓狂,希望社区能够提供帮助。我正在尝试根据与数据库记录相对应的 API 密钥完成对记录 ID 的查找,这样我就可以将此记录用作外键,从另一个数据库表中派生出另一组结果。我正在使用一个预先存在的数据库

错误显示如下。

loopback:connector:mssql Result: null {"recordsets":[[]],"recordset":[],"output":{},"rowsAffected":[0]} +302ms /Users/bloop/Desktop/AngularTestFolder/ZaharaReporting/zaharareporting/dist/controllers/tenancy.controller.js:27 return 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 密钥的所有业务部门。

2个回答

I wasn't using promises correctly(And possibly may not still), but this functions correctly for me

在 LoopBack 4 中,我们避免使用 .then().catch() API,而使用 await 和常规 try/catch 块。

export class TenancyController {
  //...
  async GetBusinessunit(
    @param.path.string('apikey') Apikey: String
  ): Promise<Businessunit[]> {
    const a = await this.tenancyRepository.findOne(
      { where: { apikey: Apikey }, fields: { tenancyid: true }, limit: 1 }
    );

    let id = -1;
    if (a !== null) {
      id = Number(a!.tenancyid);
    }
    return this.businessunitRepository.find(
      { where: { tenancyid: id } })
    });
  }
}
Miroslav Bajtoš
2019-06-17

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

我没有正确使用承诺(可能仍然不正确),但这对我来说是正确的。

@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 } })
    })
  }
PhantomThor
2019-06-07