mysql - 如何在创建钩子(Hook)调用 mysql 函数之前进行 FEATHERS-sequelize

标签 mysql sequelize.js feathersjs

我正在尝试重现 Java/Hibernate/TABLE 序列功能 https://dzone.com/articles/hibernate-identity-sequence使用 feathersjs-sequelize 和 mysql 数据库。

所以,我在mysql中创建了如下函数

FUNCTION `generate_pessoa_seq`() RETURNS bigint(16)
BEGIN
DECLARE R_ID BIGINT(16);
UPDATE pessoa_seq SET next_value = next_value + 1;
SELECT next_value INTO R_ID FROM pessoa_seq;
RETURN R_ID;

之后我在 mysql cli 中测试:

mysql> select generate_pessoa_seq();
+-----------------------+
| generate_pessoa_seq() |
+-----------------------+
|                    11 |
+-----------------------+
1 row in set (0,00 sec)

好的。现在,我可以使用 11 作为名为“pessoa”的表的 ID 值。

所以我试着按照下面的想法(pessoa hook)

const pessoaBeforeCreateHook = options => { // always wrap in a function so you can pass options and for consistency.
  return hook => {
    console.log('Pessoa hook ' + hook);

    sequelize = hook.app.get('sequelize');
    var newId = -1; //forcing an error
    sequelize.query('select generate_pessoa_seq();',{ type: sequelize.QueryTypes.SELECT}).then(function(response){

       //getNewId();
       newId = response;

    }).error(function(err){
      console.log(err);
      newId=-1;
    });
    hook.data.IdiPessoa=newId;
    return Promise.resolve(hook); // A good convention is to always return a promise.
  };
};

exports.before = {
  all: [],
  find: [],
  get: [],
  create: [pessoaBeforeCreateHook()],
  update: [],
  patch: [],
  remove: []
};

感谢您的帮助。

最佳答案

达夫说:

Sequelize 查询返回一个 promise 并异步运行,所以任何你想在它解析后运行的逻辑都需要在 .then 处理程序中。您还必须从 Hook 函数返回该 promise ,以便它会等待直到完成:

所以,最后的代码在这里:

pessoaService.hooks({
  before: {
    create(hook) {
    const sequelize = app.get('sequelize');
    var newId = -1; //forcing an error 
    return sequelize.query('select generate_pessoa_seq() as nextId;',{
      nest: true,
      raw: true }).then(function(response){
        //getNewId();
        var stringId = response[0];
        newId =  parseInt(stringId.nextId, 10);
        hook.data.IdiPessoa=newId;
        return hook;
      }).error(function(err){
        console.log(err);
        return hook; 
      });
    }
  }
});

关于mysql - 如何在创建钩子(Hook)调用 mysql 函数之前进行 FEATHERS-sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42073951/

相关文章:

node.js - 无法创建具有一对多关系的对象

mysql - Sequelize - 如何在一个种子文件中创建多个记录

javascript - FeathersJS auk 服务器填充 Hook 不起作用

mysql - SQL数据库创建错误

mysql - 选择某个时间段之前和之后存在的值

SQL 'LIKE' 语法

javascript - MobX + react native : way to inject stores

PHP 未将数组插入 MySQL 数据库

sequelize.js - 是否可以在单个事务中使用 sequelize 中的条件 promise 执行嵌套查询?

javascript - 具有三种模式的 Mongoose 多对多