Узел / Sequelize: загрузка всех моделей - PullRequest
0 голосов
/ 14 мая 2018

У меня есть 4 модели в папке моделей (ремесленники, магазины, предметы и itemStores,), но он загружает только модель предметов в переменную 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, а его ключи - ['Item ',' sequelize ',' Sequelize '].

1 Ответ

0 голосов
/ 14 мая 2018

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);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...