我试图使用续集交易进行休息请求,遗憾的是它不起作用:
undefined is not a function
这意味着sequelize.transaction未定义,sequelize已导入但未实例化以便在我的路线中使用:
router.post('/', secret.ensureAuthorized, function(req, res) {
var sequelize = models.sequelize;
var newpost;
sequelize.transaction({autocommit: false}, function (t) {
return models.post.build().updateAttributes({
title: req.body.title,
shortdescription: req.body.description.substring(0,255),
description: req.body.description,
titleImage: req.body.titleImage,
link: req.body.link,
userid: req.body.userid
}, {transaction: t}).then(function(post){
newpost = post;
// create categories
var tags = req.body.categories;
models.hashtag.bulkCreate(tags, {transaction: t}).then(function(){
newpost.setTags(tags, {transaction: t});
});
});
}).then(function (result) {
// Transaction has been committed
// result is whatever the result of the promise chain returned to the transaction callback is
if (newpost) {
res.json(newpost);
}
console.log(result);
}).catch(function (e) {
// Transaction has been rolled back
// err is whatever rejected the promise chain returned to the transaction callback is
throw e;
});
});
我的模型没有任何问题,快速路线也在运作,但没有交易。
我的包json
{
"name": "myapp",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.12.4",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.12.4",
"jade": "~1.9.2",
"morgan": "~1.5.3",
"serve-favicon": "~2.2.1",
"jsonwebtoken": "^5.0.2",
"pg": "^4.4.0",
"pg-hstore": "^2.3.2",
"crypto-js": "^3.1.5",
"sequelize": "^3.2.0"
}
}
我的index.js工作正常,但不知道如何为快递路线传递相同的续集实例:
var Sequelize = require('sequelize');
var config = require('../config'); // we use node-config to handle environments
var fs = require("fs");
var path = require("path");
var models = require('../models');
// initialize database connection
var sequelize = new Sequelize(
config.database.name,
config.database.username,
config.database.password, {
dialect: 'postgres',
host: config.database.host,
port: config.database.port,
autoIncrement: true,
omitNull: true,
freezeTableName: true,
pool: {
max: 15,
min: 0,
idle: 10000
},
});
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;
sequelize.sync({
force: true
}).then(function(){
// load batch
if (process.env.BATCH) {
console.log("loading batch");
var batch = require("../config/batch");
batch.loadPosts();
}
});
module.exports = db;
最好的问候。
更新 我改变了上面解释的代码。 现在我的错误是:
Unhandled rejection Error: commit has been called on this transaction(c457e532-b
164-43dc-9b0e-432be031fe36), you can no longer use it
我正在使用Postgres数据库。
答案 0 :(得分:1)
在我看来,您的数据库初始化代码可能存储在名为sequelize.js
的文件中,您尝试在路由处理程序中导入该文件。
但是,您要导入全局sequelize
模块,而不是本地模块。您需要使用相对路径来执行此操作:
router.post('/', function(req, res) {
var sequelize = require('./sequelize');
sequelize.transaction(function(t){
console.log('transaction openned'+t);
});
});
(假设您的sequelize.js
文件与路由处理程序文件位于同一目录中;如果不存在,则应更改./
部分
答案 1 :(得分:1)
这是我的最终解决方案,我不知道如何回复这些承诺,现在我可以这样做:
var sequelize = models.sequelize;
var newpost;
// create categories
var tags = req.body.categories;
sequelize.transaction({autocommit: false}, function (t) {
return models.post.build().updateAttributes({
title: req.body.title,
shortdescription: req.body.description.substring(0,255),
description: req.body.description,
titleImage: req.body.titleImage,
link: req.body.link,
userid: req.body.userid
}, {transaction: t}).then(function(post){
newpost = post;
for (var i = 0; i < tags.length;i++) {
// ({where: {username: 'sdepold'}, defaults: {job: 'Technical Lead JavaScript'}})
return models.hashtag.findOrCreate(
{where: {description: tags[i].description},
defaults: {description: tags[i].description},
transaction: t}).spread(function(tag, created) {
return newpost.addTag(tag, {transaction: t});
});
}
});
}).then(function (result) {
// Transaction has been committed
// result is whatever the result of the promise chain returned to the transaction callback is
if (newpost) {
res.json(newpost);
}
console.log(result);
}).catch(function (e) {
// Transaction has been rolled back
// err is whatever rejected the promise chain returned to the transaction callback is
res.status(500).send({
type: false,
data: e
});
throw e;
});