Как принудительно выполнить фильтрацию данных на основе родительского идентификатора, после дополнительного поиска по ключу API в Loopback4 / Typescript - PullRequest
0 голосов
/ 03 июня 2019

Я немного новичок в Typescript и loopback (lb4), и я нахожусь в затруднительном положении, когда я немного дергаю себя за волосы и надеюсь, что сообщество сможет помочь. Я пытаюсь завершить поиск идентификатора записи на основе ключа API, который сопоставлен с записью базы данных, поэтому я могу использовать эту запись в качестве внешнего ключа для получения другого набора результатов из другой таблицы базы данных. Я работаю с уже существующей базой данных

Ошибка, показанная ниже.

loopback: соединитель: mssql Результат: ноль { "" Наборы записей: [[]], "записи": [], "выход": {}, "rowsAffected": [0]} + 302ms /Users/bloop/Desktop/AngularTestFolder/ZaharaReporting/zaharareporting/dist/controllers/tenancy.controller.js:27 return object.tenancyid.valueOf; ^

TypeError: Невозможно прочитать свойство tenancyid с нулевым значением

Я пробовал несколько вещей и подозреваю, что это нехватка понимания некоторых основ машинописи или 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 ]

0 голосов
/ 17 июня 2019

Я не правильно использовал обещания (и, возможно, не все еще), но у меня это работает правильно

В LoopBack 4 мы избегаем API .then() и .catch()в пользу 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 } })
    });
  }
}
0 голосов
/ 07 июня 2019

Просто ответ на мой собственный вопрос, если кто-то надеется попробовать подобный результат.

Я не правильно использовал обещания (и, возможно, не все еще), но это работает правильно для меня.

@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 } })
    })
  }
...