Добавить транзакцию для продолжения - PullRequest
0 голосов
/ 29 января 2020

Я начинаю с sequelize, чтобы создать API, и у меня возникает проблема с транзакциями.

Моя конфигурация базы данных сиквелиза выглядит следующим образом:


import databaseConfig from '../config/database';

import User from '../app/models/User';
import File from '../app/models/File';
import Address from '../app/models/Address';
import Customer from '../app/models/Customer';
import Product from '../app/models/Product';
import ServiceOrder from '../app/models/ServiceOrder';
import OrderStatus from '../app/models/OrderStatus';

const models = [
  User,
  File,
  Address,
  Customer,
  Product,
  ServiceOrder,
  OrderStatus,
];

class Database {
  constructor() {
    this.init();
  }

  async init() {
    this.connection = new Sequelize(databaseConfig);

    models
      .map(model => model.init(this.connection))
      .map(model => model.associate && model.associate(this.connection.models));
  }
}

export default new Database();

Тогда у меня есть orderStatusController с функциями для сохранения в базе данных следующим образом:

import sequelize from 'sequelize';
import OrderStatus from '../models/OrderStatus';

class OrderStatusController {
  async store(req, res) {
    sequelize
      .transaction(t => {
        return OrderStatus.create(
          {
            description: 'Aguardando Orçamento',
          },
          { transaction: t }
        );
      })
      .then(result => res.json(result))
      .catch(err => res.json({ error: err }));
  }
}

export default new OrderStatusController();

Я получил транзакцию - это не ошибка функции.

Каков наилучший способ решить эту проблему? Я прочитал, что мне нужно создать экземпляр sequelize, но у меня уже есть конфигурация базы данных.

Есть ли способ использовать конфигурацию моей базы данных? Я не хочу создавать еще один "новый Sequelize ()" в контроллере.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 29 января 2020

Вот один из способов. Код сервера my_db_app:

const sequelizeDB  = new Sequelize( myConfigOptions ); 

// other code...

server.listen(myPort, () => {

  sequelizeDB.Promise = global.Promise;
  sequelizeDB
      .authenticate()
      .then(() =>   { console.log('connected!');})
      .catch(err => { console.error(err);});

  // for controllers or models ...
  module.exports = {sequelizeDB : sequelizeDB}

Затем контроллер, которому требуется транзакция, может импортировать объект БД:

   const db_app = require("../my_db_app");
   const sequelizeDB = db_app.sequelizeDB;

   // other code...

    sequelizeDB.transaction(function (myTransaction) {                    

        User.create({name: 'Joe', { transaction: myTransaction })
        .catch(function(error) {
           console.log("Error in User Create");
           throw error;
        });

        // other code on same transaction here...

    }).then(function () {
        console.log("SUCCESS!");
        next();
    }).catch(function (err) {
        console.log("FAILURE !");
    });

HTH

...