在Express路由器里创buildsequelize事务

我正在尝试使用sequelize事务作出rest请求,不幸的是它不起作用:

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数据库。

这是我的最终解决scheme,我不知道如何回复这些承诺,现在我可以这样做:

 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; }); 

在我看来,你的数据库初始化代码可能存储在一个名为sequelize.js的文件中,你正试图在你的路由处理器中导入这个文件。

但是,您正在导入全局的sequelize模块,而不是您本地的。 你需要使用相对path来做到这一点:

 router.post('/', function(req, res) { var sequelize = require('./sequelize'); sequelize.transaction(function(t){ console.log('transaction openned'+t); }); }); 

(假设你的sequelize.js文件和你的路由处理程序文件位于同一个目录中;否则,你应该改变./部分)