Node/Sequelize:加载所有模型 [英] Node/Sequelize: loading all models

查看:16
本文介绍了Node/Sequelize:加载所有模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have 4 models in the models folder (artisans, stores, items and itemStores,) but it only loads the items model into the db variable. Why might this be?

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

./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

./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

./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

./models/itemStore.js

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

    return itemStore;
};

./models/store.js

./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;
};

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

Another detail I can add is that I did a tutorial to come up with the skeleton for this. the tutorial had only an items model, so this might be an artifact from that.

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

The output of console.log(db) is too large to submit here, but it returns a json and its keys are [ 'Item', 'sequelize', 'Sequelize' ].

推荐答案

1) 创建文件夹database/definitions

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

2) Put that index.js in models folder to database folder

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

3) Put Your model definitions (schemas) into database/definitions folder

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

4) Create database/definitions/index.js and define such body:

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




    当您需要添加新定义时:




    when You'll need to add new definition:

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

    1) just add it to database/definitions/User.js as examples from other definition

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

    2) and define it in database/definitions/index.js by adding a line:

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

    一切都会自动处理.

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

    3) and in Your example route:

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

    这篇关于Node/Sequelize:加载所有模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆