【问题标题】:Node/Sequelize: loading all modelsNode/Sequelize:加载所有模型
【发布时间】:2018-05-15 04:58:05
【问题描述】:

我在模型文件夹中有 4 个模型(artisans、stores、items 和 itemStores),但它只将 items 模型加载到 db 变量中。为什么会这样?

server.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var db = require('./models');
var artisans = require('./app/routes/artisans.js');
var stores = require('./app/routes/stores.js');
var items = require('./app/routes/items.js');
var itemStores = require('./app/routes/itemStores.js');

var PORT = process.env.PORT || 3000;

// Set up the express app to handle data parsing
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended : true }));
app.use(bodyParser.text());
app.use(bodyParser.json({ type : "application/vmd.api-json"}));

// Static directory
app.use(express.static("app/public"));

artisans(app, db);
stores(app, db);
items(app, db);
itemsStores(app, db);

console.log(Object.keys(db));

db.sequelize.sync().then(function () {
    app.listen(PORT, function () {
        console.log('Listening on PORT ' + PORT);
    });
});

./models/index.js

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(__filename);
var env       = process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.json')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], 
config);
} else {
  var sequelize = new Sequelize(config.database, config.username, 
config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && 
(file.slice(-3) === '.js');
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

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

module.exports = db;

./models/artisan.js

module.exports = function (sequelize, DataTypes) {
    var artisan = sequelize.define("Item", {
        name: DataTypes.STRING,
        email: DataTypes.STRING,
        website: DataTypes.STRING,
        phoneNumber: DataTypes.INTEGER
    });

    return artisan;
};

./models/item.js

module.exports = function (sequelize, DataTypes) {
    var item = sequelize.define("Item", {
        name: DataTypes.STRING,
        price: DataTypes.DECIMAL,
        category: DataTypes.STRING,
        artisanId: DataTypes.INTEGER
    });

    return item;
};

./models/itemStore.js

module.exports = function (sequelize, DataTypes) {
    var itemStore = sequelize.define("Item", {
        itemId: DataTypes.INTEGER,
        storeId: DataTypes.INTEGER
    });

    return itemStore;
};

./models/store.js

module.exports = function (sequelize, DataTypes) {
    var store = sequelize.define("Item", {
        name: DataTypes.STRING,
        addressLineOne: DataTypes.STRING,
        addressLineTwo: DataTypes.STRING,
        city: DataTypes.STRING,
        state: DataTypes.STRING,
        zip: DataTypes.INTEGER
    });

    return store;
};

我可以补充的另一个细节是我做了一个教程来为此提出骨架。本教程只有一个项目模型,所以这可能是一个工件。

console.log(db)的输出太大,这里提交,但是它返回一个json,它的key是['Item','sequelize','Sequelize']。

【问题讨论】:

  • 显示./models中的代码
  • 发布更多代码。同时发布console.log(db)的输出
  • sequelize.define() 是database tables 的定义,在您的情况下,它们都被命名为Item。

标签: node.js express sequelize.js


【解决方案1】:

1) 创建文件夹database/definitions

2) 将index.js 放入models 文件夹到database 文件夹

3) 将您的模型定义(模式)放入database/definitions 文件夹

4) 创建database/definitions/index.js 并定义这样的主体:

'use strict';

module.exports.Artisan = require('./Artisan');
module.exports.Store = require('./Store');
module.exports.Item = require('./Item');
module.exports.ItemStore = require('./ItemStore');
  • 确保定义文件是大写的 - 这是为了约定

5) 模型定义:

数据库/定义/Artisan.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  name: DataTypes.STRING,
  email: DataTypes.STRING,
  website: DataTypes.STRING,
  phoneNumber: DataTypes.INTEGER
};

数据库/定义/Store.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  name: DataTypes.STRING,
  addressLineOne: DataTypes.STRING,
  addressLineTwo: DataTypes.STRING,
  city: DataTypes.STRING,
  state: DataTypes.STRING,
  zip: DataTypes.INTEGER
};

数据库/定义/Item.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  name: DataTypes.STRING,
  price: DataTypes.DECIMAL,
  category: DataTypes.STRING,
  artisanId: DataTypes.INTEGER
};

数据库/定义/ItemStore.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  itemId: DataTypes.INTEGER,
  storeId: DataTypes.INTEGER
};

6)database/index.js的完整代码:

'use strict';

const Sequelize = require('sequelize');
const env       = process.env.NODE_ENV || 'development';
const config    = require(__dirname + '/../config/config.json')[env];

const connection = config.use_env_variable ? 
  new Sequelize(process.env[config.use_env_variable], config) :
  new Sequelize(config.database, config.username, config.password, config);

const definitions = require('./definitions'); 
const models = {};
for(const name in definitions) {
  models[name] = connection.define(name, definitions[name]);
}

module.exports = {
  connection, models
};

7)server.js的完整代码:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const db = require('./database');

var PORT = process.env.PORT || 3000;

// Set up the express app to handle data parsing
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended : true }));
app.use(bodyParser.text());
app.use(bodyParser.json({ type : "application/vmd.api-json"}));
app.use(express.static("app/public"));

// how to use models:
app.get('/artisans/:id', async (req, res) => {
  try {
    const Artisan = db.models.Artisan;
    const artisan = await Artisan.findOne({id: req.params.id});
    res.status(200).send(artisan);
  }
  catch (error) {
    res.status(500).send(error);
  }
});


db.connection.sync().then(() => {
  app.listen(PORT, () => console.log('Listening on PORT:', PORT));
});




当您需要添加新定义时:

1) 只需将其添加到 database/definitions/User.js 作为其他定义的示例

2) 并通过添加一行在database/definitions/index.js 中定义它:

module.exports.User = require('./User');

一切都会自动处理。

3) 并在您的示例路线中:

app.get('/users/:id', async (req, res) => {
  try {
    const User = db.models.User;
    const user = await User.findOne({id: req.params.id});
    res.status(200).send(user);
  }
  catch (error) {
    res.status(500).send(error);
  }
});

【讨论】:

  • 谢谢!它现在可以识别定义常量中的所有模型;但是,我不确定您所说的“//将定义附加到续集连接”是什么意思我试过:definition.sequelize.sync()并得到一个错误:TypeError:无法读取未定义的属性“同步”
  • @KyleJosephGreen 仔细阅读,我正在考虑将文件与 DB 驱动程序分离。附加部分只是迭代该定义并附加到 Sequelize 连接。
  • @KyleJosephGreen 看来我得为你写续集到定义附加逻辑)))
  • hmm...好吧,我可以看到每个定义都有其价值的功能。你是说我需要把这个函数附加到 Sequelize Object 上?
  • 好文章!这对我帮助很大。 +1
猜你喜欢
  • 2015-07-11
  • 2015-10-18
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多