我从 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 中的文档对我来说并不容易理解,因为我不知道如何应用它
因为 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...
});
}
非托管事务
如果您想提高交易的透明度和/或控制权,您可以使用非托管交易。在这种情况下,您 必须 手动调用
commit
和 rollback
。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 t.commit();
})
.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 t.commit();
} catch (err) {
await t.rollback();
}
}
关于mysql - 添加事务以 Sequelize 创建模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54736088/