在Express路由器

时间:2015-06-28 02:48:27

标签: node.js express sequelize.js

我试图使用续集交易进行休息请求,遗憾的是它不起作用:

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

2 个答案:

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