节点/续集:加载所有模型

Kyl*_*een 1 node.js express sequelize.js

我在models文件夹(artisans,stores,items和itemStores)中有4个模型,但它只将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);
    });
});
Run Code Online (Sandbox Code Playgroud)

./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;
Run Code Online (Sandbox Code Playgroud)

./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;
};
Run Code Online (Sandbox Code Playgroud)

./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;
};
Run Code Online (Sandbox Code Playgroud)

./models/itemStore.js

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

    return itemStore;
};
Run Code Online (Sandbox Code Playgroud)

./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;
};
Run Code Online (Sandbox Code Playgroud)

我可以添加的另一个细节是我做了一个教程来为此提出骨架.该教程只有一个项目模型,所以这可能是一个神器.

console.log(db)的输出太大而无法在此处提交,但它返回一个json,其键是['Item','sequelize','Sequelize'].

num*_*8er 5

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');
Run Code Online (Sandbox Code Playgroud)
  • 确保定义文件是UpperCased - 它适用于常规

5)模型定义:

数据库/定义/ Artisan.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  name: DataTypes.STRING,
  email: DataTypes.STRING,
  website: DataTypes.STRING,
  phoneNumber: DataTypes.INTEGER
};
Run Code Online (Sandbox Code Playgroud)

数据库/定义/ 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
};
Run Code Online (Sandbox Code Playgroud)

数据库/定义/ Item.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  name: DataTypes.STRING,
  price: DataTypes.DECIMAL,
  category: DataTypes.STRING,
  artisanId: DataTypes.INTEGER
};
Run Code Online (Sandbox Code Playgroud)

数据库/定义/ ItemStore.js

'use strict';

const DataTypes = require('sequelize');

module.exports = {
  itemId: DataTypes.INTEGER,
  storeId: DataTypes.INTEGER
};
Run Code Online (Sandbox Code Playgroud)

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
};
Run Code Online (Sandbox Code Playgroud)

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));
});
Run Code Online (Sandbox Code Playgroud)




当你需要添加新的定义时:

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

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

module.exports.User = require('./User');
Run Code Online (Sandbox Code Playgroud)

一切都将自动处理.

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 好的写作!这对我帮助很大.+1 (2认同)