问题
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
'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;
};
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.
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:
1) Create folder database/definitions
2) Put that index.js in models folder to database folder
3) Put Your model definitions (schemas) into database/definitions folder
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');
- make sure definition files are UpperCased - it's for convention
5) Model definitions:
database/definitions/Artisan.js
'use strict';
const DataTypes = require('sequelize');
module.exports = {
name: DataTypes.STRING,
email: DataTypes.STRING,
website: DataTypes.STRING,
phoneNumber: DataTypes.INTEGER
};
database/definitions/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
};
database/definitions/Item.js
'use strict';
const DataTypes = require('sequelize');
module.exports = {
name: DataTypes.STRING,
price: DataTypes.DECIMAL,
category: DataTypes.STRING,
artisanId: DataTypes.INTEGER
};
database/definitions/ItemStore.js
'use strict';
const DataTypes = require('sequelize');
module.exports = {
itemId: DataTypes.INTEGER,
storeId: DataTypes.INTEGER
};
6) Full code of 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) Full code of 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) just add it to database/definitions/User.js as examples from other definition
2) and define it in database/definitions/index.js by adding a line:
module.exports.User = require('./User');
everything will be handled automatically.
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);
}
});
来源:https://stackoverflow.com/questions/50335123/node-sequelize-loading-all-models