Node/Sequelize:加载所有模型 [英] Node/Sequelize: loading all models
问题描述
我在模型文件夹中有 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屋!