首页 > 解决方案 > 使用 Loopback4 调用 MYSQL 存储过程的正确方法

问题描述

我正在尝试使用 Loopback 4 ( https://loopback.io ),调用存储过程并获取返回结果的正确方法是什么?我是否创建存储库或模型(用于返回的数据)?还是我应该在控制器内做所有事情?

标签: loopback4

解决方案


为了简单起见,我直接从控制器调用 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 只是一个包含 mysql 连接设置的 json 文件:

{
  "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是通常的回环模型文件,对应mysql中存储过程PRODUCTSEARCH返回的内容:

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

推荐阅读