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)?
Неявные зависимости -- зло. Во-первых, труднее разбираться потом/другому человеку, что от чего зависит и где может поломаться. Во-вторых, труднее контролировать, не слишком ли разросся этот модуль. В-третьих, явное лучше неявного. Это как глобальные переменные, только еще и неявные.