Правильный способ вызова хранимой процедуры MYSQL с помощью Loopback4

Я пытаюсь использовать Loopback 4 (https://loopback.io), как правильно вызвать хранимая процедура и получить возвращенные результаты? Могу ли я создать репозиторий или модель (для возвращаемых данных)? Или все делать внутри контроллера?


person user11410830    schedule 06.08.2019    source источник


Ответы (1)


Для простоты я вызвал хранимые процедуры mysql прямо из контроллеров.

import {Request, RestBindings, get, ResponseObject, getModelSchemaRef} from '@loopback/rest';
import {inject} from '@loopback/context';
import {param} from '@loopback/openapi-v3';
import {Product} from '../models';

const mysql = require('mysql');
const db = require('mysql-promise')();
const mysqlCreds = require('../datasources/retaildb.datasource.json');

export class V1Controller {
  private connection: any;

constructor(@inject(RestBindings.Http.REQUEST) private req: Request) {
  db.configure(mysqlCreds, mysql);
  this.connection = db;
}

@get('/search', {
  responses: {
    '200': {
      description: 'Search for Products using keyword(s)',
      content: {
        'application/json': {
          schema: {type: 'array', items: getModelSchemaRef(Product)},
        },
      },
    },
  },
})
async search(@param.query.string('key') key: string): Promise<Product> {
  const sqlStmt = mysql.format('CALL PRODUCTSEARCH(?)', [key]);

  return new Promise<Product>(function(resolve, reject) {
    db.query(sqlStmt, function(err: any, results: any) {
      if (err !== null) return reject(err);
      resolve(results[0]);
    });
  });
}

В этом примере retaildb.datasource.json - это просто файл json, содержащий настройки подключения mysql:

{
  "name": "retaildb",
  "connector": "mysql",
  "url": "",
  "host": "ec2-x-x-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
  "port": 3306,
  "user": "root",
  "password": "mysqlpassword",
  "database": "retail"
}

И Product - это обычный файл модели обратной петли, соответствующий тому, что возвращает хранимая процедура PRODUCTSEARCH в mysql:

CREATE DEFINER=`root`@`%` PROCEDURE `ProductSearch`(IN `searchkey` varchar(120))
BEGIN
  SELECT * FROM Product WHERE MATCH(description) AGAINST (searchkey IN NATURAL LANGUAGE MODE);
END
person user235650    schedule 23.08.2019