最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

将事务添加到sequelize create module

IT培训 admin 4浏览 0评论

将事务添加到sequelize create module

我从sequelize开始创建一个API,我面临着交易问题。

我的sequelize数据库配置如下所示:

var Sequelize = require('sequelize');

var sequelize = new Sequelize(CONFIG.database, env.user, 
 env.password, {
 host: env.host,
 dialect: env.dialect,
 port: env.port,
 operatorsAliases: false
});

var db = {};


fs.readdirSync(__dirname).filter(function (file) {
 return (file.indexOf('.') !== 0) && (file !== 'index.js');
}).forEach(function (file) {
 var model = sequelize.import(path.join(__dirname, file));
 db[model.name] = model;
});

Object.keys(db).forEach(function (modelName) {
 if ('associate' in db[modelName]) {
  db[modelName].associate(db);
 }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

然后我有一个stockcontroller,其函数可以保存在数据库中,如下所示:

var exports = module.exports = {}
let Stock = require('../models').Stock;
let StockVariant = require('../models').StockVariant;

exports.create = function (req, res) {
  const body = req.body;
  console.log(body);
  Stock.create(body).then(function (stock, created) {})...}

我想创建事务以在单个事务中保存到stockvariant和stock表,并且可以选择在出错时回滚。

sequelize中的文档对我来说并不容易理解,因为我看不到如何应用它

return sequelize.transaction(function(t){return User.create({})})

因为t当然没有在任何地方定义,我的stockcontroller不会导入sequelize。

所以最后我不明白如何定义交易功能来创建新股票线的基本概念。

谢谢你的帮助!

回答如下:

需要导入sequelize实例以使用事务。它已经使用此行db.sequelize = sequelize导出到数据库配置文件中。

您需要做的就是在当前导入中添加它:

var exports = module.exports = {}
const Stock = require('../models').Stock; // Prefer const usage to avoid overwritting imports
const StockVariant = require('../models').StockVariant;
const sequelize = require('../models').sequelize;

这也可以使用解构在一行中完成:

const { Stock, StockVariant, sequelize } = require('../models');

现在我们来谈谈。正如documentation所述,您有两种处理方式:托管或非托管。

托管交易

这是通过在sequelize事务回调中链接异步操作来完成的。在这种情况下,如果链接到事务的操作成功,则事务将自动提交,否则将回滚。

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    sequelize.transaction(function(t) {       
        return Stock.create(body, {transaction: t}) // We pass the transaction as a parameter here !
          .then(function(stock, created) {
               return StockVariant.create(..., {transaction: t}) // The transaction, again here
          })
     .catch(function(err) {
       // Handle your error...
     });  
}

非托管交易

如果您希望更透明和/或控制您的事务,则可以使用非托管事务。在这种情况下,您必须手动调用commitrollback

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    sequelize.transaction
     .then(function(t) { // Note the 'then' usage here
        return Stock.create(body, {transaction: t}); // We pass the transaction as a parameter here !
          .then(function(stock, created) {
               return StockVariant.create(..., {transaction: t}); // The transaction, again here
          });
     .then(function() {
         return tmit();
     })
     .catch(function(err) {
         return t.rollback();
     });  
}

这也可以使用async / await语法完成,这可能更令人愉快阅读:

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    let t; // The variable in which the transaction object will be stored
    try {
        t = await sequelize.transaction();
        const stock = await Stock.create(body, {transaction: t})
        await StockVariant.create(..., {transaction: t}) // Whatever parameter you need to pass here
        await tmit();
    } catch (err) {
        await t.rollback();
    }
}

将事务添加到sequelize create module

我从sequelize开始创建一个API,我面临着交易问题。

我的sequelize数据库配置如下所示:

var Sequelize = require('sequelize');

var sequelize = new Sequelize(CONFIG.database, env.user, 
 env.password, {
 host: env.host,
 dialect: env.dialect,
 port: env.port,
 operatorsAliases: false
});

var db = {};


fs.readdirSync(__dirname).filter(function (file) {
 return (file.indexOf('.') !== 0) && (file !== 'index.js');
}).forEach(function (file) {
 var model = sequelize.import(path.join(__dirname, file));
 db[model.name] = model;
});

Object.keys(db).forEach(function (modelName) {
 if ('associate' in db[modelName]) {
  db[modelName].associate(db);
 }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

然后我有一个stockcontroller,其函数可以保存在数据库中,如下所示:

var exports = module.exports = {}
let Stock = require('../models').Stock;
let StockVariant = require('../models').StockVariant;

exports.create = function (req, res) {
  const body = req.body;
  console.log(body);
  Stock.create(body).then(function (stock, created) {})...}

我想创建事务以在单个事务中保存到stockvariant和stock表,并且可以选择在出错时回滚。

sequelize中的文档对我来说并不容易理解,因为我看不到如何应用它

return sequelize.transaction(function(t){return User.create({})})

因为t当然没有在任何地方定义,我的stockcontroller不会导入sequelize。

所以最后我不明白如何定义交易功能来创建新股票线的基本概念。

谢谢你的帮助!

回答如下:

需要导入sequelize实例以使用事务。它已经使用此行db.sequelize = sequelize导出到数据库配置文件中。

您需要做的就是在当前导入中添加它:

var exports = module.exports = {}
const Stock = require('../models').Stock; // Prefer const usage to avoid overwritting imports
const StockVariant = require('../models').StockVariant;
const sequelize = require('../models').sequelize;

这也可以使用解构在一行中完成:

const { Stock, StockVariant, sequelize } = require('../models');

现在我们来谈谈。正如documentation所述,您有两种处理方式:托管或非托管。

托管交易

这是通过在sequelize事务回调中链接异步操作来完成的。在这种情况下,如果链接到事务的操作成功,则事务将自动提交,否则将回滚。

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    sequelize.transaction(function(t) {       
        return Stock.create(body, {transaction: t}) // We pass the transaction as a parameter here !
          .then(function(stock, created) {
               return StockVariant.create(..., {transaction: t}) // The transaction, again here
          })
     .catch(function(err) {
       // Handle your error...
     });  
}

非托管交易

如果您希望更透明和/或控制您的事务,则可以使用非托管事务。在这种情况下,您必须手动调用commitrollback

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    sequelize.transaction
     .then(function(t) { // Note the 'then' usage here
        return Stock.create(body, {transaction: t}); // We pass the transaction as a parameter here !
          .then(function(stock, created) {
               return StockVariant.create(..., {transaction: t}); // The transaction, again here
          });
     .then(function() {
         return tmit();
     })
     .catch(function(err) {
         return t.rollback();
     });  
}

这也可以使用async / await语法完成,这可能更令人愉快阅读:

exports.create = function (req, res) {
    const body = req.body;
    console.log(body);
    let t; // The variable in which the transaction object will be stored
    try {
        t = await sequelize.transaction();
        const stock = await Stock.create(body, {transaction: t})
        await StockVariant.create(..., {transaction: t}) // Whatever parameter you need to pass here
        await tmit();
    } catch (err) {
        await t.rollback();
    }
}
发布评论

评论列表 (0)

  1. 暂无评论