@kirill-93

Sequilize NodeJS?

Здравствуйте изучаю nodejs, 3 вопроса:
1) Используют ли sequilize orm в nodejs? Много очень модулей, подскажите, чем пользуются?
2) Как в node.js правильно объявлять переменные глобально? Я у себя организовал подобие MVС, есть контроллеры, модели и вьюхи. Примерно вот так это выглядит:
В app.js
var products = require(__dirname + '/controllers/products');
app.get('/product', products.index);
app.get('/product/add', products.add);
app.get('/product/edit', products.edit);

А контроллер выглядит так:
module.exports = {
    index : function(req, res) {
        res.render('products/index', {
            'title' : 'Products list'
        });
    },
    add : function(req, res) {
        res.render('products/add', {
            'title' : 'Add product'
        });
    },
    edit : function(req, res) {
        res.render('products/edit', {
            'title' : 'Edit product'
        });
    }
}

Собственно вопрос: Как мне в контроллер использовать объект подключения к БД? Сейчас я его объявил глобально в app.js
sequelize = new Sequelize('mysql://root@localhost/nodejs');

Но есть ведь наверное более красивый подход?
3) При такой структуре MVC приходится все контроллеры и модели вручную подключать. Можно ли как-то автоматизировать (подобие __autoload() в PHP)?

UPD: Еще один вопрос: правильно ли я получаю результаты из БД через колбэк?
product.findAll().then(function(prods) {
            var products = [];
            prods.forEach(function(prod) {
                products.push(prod);
            });

            res.render('products/index', {
                'title'     : 'Products list',
                'products'  : products
            });
        });
  • Вопрос задан
  • 1157 просмотров
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
1) Используют ли sequilize orm в nodejs? Много очень модулей, подскажите, чем пользуются?
Кто-то пользуется, кто-то нет. Люди разные, проекты тоже разные. Я в одном проекте использую, в другом нет. В чем, собственно, вопрос?

Как в node.js правильно объявлять переменные глобально?

Вот так: global.varName = 'hello world';
Но вообще это не очень аккуратно. Глобальные переменные -- зло. Вот как сделано у меня (ES6):

// dbConnect.js
'use strict';

const Sequelize = require('sequelize');
const settings = require('./settings');
const connection = new Sequelize(settings.db);

const modelNames = ['Order', 'User'];

for (const modelName of modelNames) {
    connection.import(`./models/${modelName}.js`);
}

for (const modelName of Object.keys(connection.models)) {
    if ('associate' in connection.models[modelName]) {
        connection.models[modelName].associate(connection.models);
    }
}

module.exports = connection;

// models/User.js
'use strict';

const generatePassword = require('password-generator');

module.exports = (sequelize, DataTypes) => {
    let User;

    const schema = {
        username: {type: DataTypes.STRING, validate: {isEmail: true}},
        password: DataTypes.STRING
    };

    const options = {
        paranoid: true,
        classMethods: {
            authOrCreate (username, done) {
                const query = {
                    where: {
                        username
                    },
                    defaults: {
                        password: generatePassword()
                    }
                };
                this.findOrCreate(query).spread((user, created) => {
                    if (created) {
                        done(null, user);
                    } else {
                        done(null, user);
                    }
                }, (err) => {
                    done(err);
                });
            },

            associate (models) {
                User.hasMany(models.Order);
            }
        }
    };

    User = sequelize.define('User', schema, options);

    return User;
};

// где-то в контроллере
const Orders = require('../../dbConnection').models.Orders;

Дело в том, что commonjs-модули кэшируются, и исполняются только в момент первого вызова, потом результат просто возвращается снова и снова. Так что достаточно сделать require('./path/to/dbConnect') из любого места, и вуаля, вот вам подключение.

Можно ли как-то автоматизировать (подобие __autoload() в PHP)?

Неявные зависимости -- зло. Во-первых, труднее разбираться потом/другому человеку, что от чего зависит и где может поломаться. Во-вторых, труднее контролировать, не слишком ли разросся этот модуль. В-третьих, явное лучше неявного. Это как глобальные переменные, только еще и неявные.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы