Я пытаюсь использовать Loopback 4 (https://loopback.io), как правильно вызвать хранимая процедура и получить возвращенные результаты? Могу ли я создать репозиторий или модель (для возвращаемых данных)? Или все делать внутри контроллера?
Правильный способ вызова хранимой процедуры MYSQL с помощью Loopback4
Ответы (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