【发布时间】:2017-09-20 14:48:25
【问题描述】:
我正在尝试使用 sequelize 事务发出休息请求,不幸的是它不起作用:
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 也可以正常工作,但不知道如何在此处为快速路由传递相同的 sequelize 实例:
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 数据库。
【问题讨论】:
标签: node.js express sequelize.js