bugfix> stored-procedures > 投稿

ストアドプロシージャを呼び出すフックの作成に問題があります。

私のカスタムサービスフック(customservice.hooks.js)は次のとおりです。

const callstored = require('../../hooks/callstored')
module.exports = {
  before: {
    all: [],
    find: [callstored()],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },
 ...

私のサービスクラス(customservice.class.js):

const mysql = require('mysql')
class Service {
  constructor (options) {
    this.options = options || {};
  }
  find (params) {
    return Promise.resolve( [] );
  }
  get (id, params) {
    return Promise.resolve({
      id, text: `A new message with ID: ${id}!`
    });
  }
  create (data, params) {
    if (Array.isArray(data)) {
      return Promise.all(data.map(current => this.create(current)));
    }
    return Promise.resolve(data);
  }
  update (id, data, params) {
    return Promise.resolve(data);
  }
  patch (id, data, params) {
    return Promise.resolve(data);
  }
  remove (id, params) {
    return Promise.resolve({ id });
  }
}
module.exports = function (options) {
  return new Service(options);
};
module.exports.Service = Service;

そして私のサービス(customservice.service.js):

const createService = require('./rankingvotes.class.js');
const hooks = require('./rankingvotes.hooks');
module.exports = function (app) {
  const paginate = app.get('paginate');
  const options = {
    name: 'rankingvotes',
    paginate
  };
  // Initialize our service with any options it requires
  app.use('/rankingvotes', createService(options));
  // Get our initialized service so that we can register hooks and filters
  const service = app.service('rankingvotes');
  service.hooks(hooks);
  app.publish(() => {
  });
};

そして最後に、私のフックは(callstored.js)です

const Sequelize = require('sequelize');
module.exports = function () {
  return function (hook) {
    sequelize = hook.app.get('sequelizeClient');
    let result=[];
    return sequelize.query('CALL RANKING();',{
      nest: true,
      raw: true }).then(function(response){
        console.log(response[0]) //data are correct
        hook.data=response[0]; 
        return hook;
      }).error(function(err){
        console.log(err);
        return hook;
      });
  }
}

コンソールを確認すると、データは正しく取得されましたが、PostmanなどのRESTクライアントからは何も呼び出されませんでした。

何か案が?ありがとうございました。

回答 1 件
  • 応答を変更する場合は、hook.resultを設定する必要があります。

    const Sequelize = require('sequelize');
    module.exports = function () {
      return async hook => {
        try {
          const sequelize = hook.app.get('sequelizeClient');
          const response = await sequelize.query('CALL RANKING();',{
            nest: true,
            raw: true
          });
          console.log(response[0]) //data are correct
          context.result = response[0]; 
        } catch(error) {
          console.error(error);
        }
        return hook;
      }
    }
    
    

    hook.dataは要求データであり、 create でのみ使用可能です 、 update  および patch

    hook.result を設定することに注意してください  意志スキップ カスタムサービス find   before に設定されている場合  針。

あなたの答え