【问题标题】:Sequelize Issue By Separating Model Logic from Model Configuration通过将模型逻辑与模型配置分离来解决问题
【发布时间】:2016-03-02 20:36:29
【问题描述】:

我遵循 sequelize 最佳实践,连接到主机并将所有模型导入到一个文件中,然后在与模型交互时调用该文件。出于某种原因,这似乎导致了一个问题,因为我在使用 sequelize 变量的define 方法时遇到错误,并且我使用包含两个逻辑的文件运行测试并且我能够添加用户。

错误:

TypeError: Cannot read property 'define' of undefined
    at new module.exports (/Users/user/Desktop/Projects/node/ann/app/models/ann-model.js:3:27)
    at /Users/user/Desktop/Projects/node/ann/app/controllers/appRoutes.js:13:20

这是我的文件,其中包含与数据库 (dbIndex.js) 的连接:

var Sequelize = require('sequelize');
var sequelize = new Sequelize('dbname', 'user', 'pwd', {
    host:'localhost',
    port:'3306',
    dialect: 'mysql'
});

sequelize
        .authenticate()
        .then(function(err) {
            if (!!err) {
                console.log('Unable to connect to the database:', err)
            } else {
                console.log('Connection has been established successfully.')
            }
        });

var db = {}

db.Ann = sequelize.import(__dirname + "/ann-model");

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

这是模型文件(ann-model.js):

module.exports = function(sequelize, DataTypes) {

var Ann = sequelize.define('ann', {
    ann_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    ann_date: DataTypes.DATE,
}, {
    freezeTableName: true
});
    return Ann;
}

这里是我用 POST 方法调用模型的地方。

(appRoutes.js):

var express = require('express');
var appRoutes   = express.Router();
var Annotation = require('../models/ann-model');

appRoutes.route('/') 

    .get(function(req, res){
        res.render('pages/activity-feed.hbs');
    })

    .post(function(req, res){

        var ann = new Ann();

        ann.ann_date = req.body.ann-date;


        annotation.save(function(err){
            if (err)
                res.send(err);
        });
    });

module.exports = appRoutes;

将逻辑和建模结合在一个文件中的测试文件:

var Sequelize = require('sequelize');
var sequelize = new Sequelize('dbname', 'user', 'pwd', {
    host:'localhost',
    port:'3306',
    dialect: 'mysql'
});


var Ann = sequelize.define('ann', {
    ann_id: {
        type: Sequelize.INTEGER,
        primaryKey: true
    },
    ann_date: Sequelize.DATE,
}, {
    freezeTableName: true
});

sequelize.sync().then(function(){
    return Ann.create({
        ann_id: 3,
        discovery: 'This is a test.'
    });
}).then(function(tation) {
    console.log(tation.get({
        plain: true
    }));
});

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    我认为你的 post 方法有问题,但是结构真的很混乱,你能这样做吗

    models/index.js

    "use strict";
    
    var fs        = require("fs");
    var path      = require("path");
    var Sequelize = require("sequelize");
    var env       = process.env.NODE_ENV || "development";
    var config    = require(__dirname + '/../config/config.json')[env];
    var sequelize = new Sequelize(config.database, config.username, config.password, config);
    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;
    

    models/ann-model.js

    "use strict";
    
    module.exports = function(sequelize, DataTypes) {
    
    var Ann = sequelize.define('ann', {
        ann_id: {
            type: DataTypes.INTEGER,
            primaryKey: true
        },
        ann_date: DataTypes.DATE,
    }, {
        freezeTableName: true
    });
        return Ann;
    }
    

    routes/index.js

    var express = require('express');
    var appRoutes   = express.Router();
    var models = require('../models');
    
    appRoutes.route('/') 
    
        .get(function(req, res){
            res.send('ok');
        })
    
        .post(function(req, res){
    
          models.ann
          .build({ ann_id: 55, ann_date: new Date() })
          .save()
          .then(function(anotherTask) {
            res.send("POST OK"); 
          }).catch(function(error) {
            res.send(error);
          })
    
        });
    
    module.exports = appRoutes;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2011-04-21
      • 2013-06-05
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多