Не могу получить имя модели для Sequelize с mysql
Я новичок в nodejs и Sequelize ORM framework. Я пытаюсь заставить его работать с mysql. Я сделал некоторые большие успехи, но в данный момент я застрял на той части, где sequelize необходимо загрузить в модели. Но я получаю ошибку, когда имя извлекается из файла.
Www
var debug = require('debug')('sampleapp')
var app = require('../server');
var models = require('../model');
app.set('port', process.env.PORT || 3000);
//server running
models.sequelize.sync().then(function () {
var server = app.listen(app.get('port'), function(){
debug('The magic is happening on port '+server.address().port);
});
});
Индекс.js
"use strict"
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var debug = require('debug');
var env = process.env.NODE_ENV || "development";
var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
var sequelize = new Sequelize(config.database, config.username, config.password, config);
var db = {};
fs.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf(".") !== 0) && (file !== 'index.js')
})
.forEach(function(file) {
var model = sequelize['import'](path.join(__dirname, file))
db[model.name] = model
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
Пользователь.js
module.exports = function(sequelize, DataType){
var User = sequelize.define('user', {
name: DataType.STRING,
password: DataType.STRING,
lastName: DataType.STRING,
email: DataType.STRING,
gender: DataType.CHAR,
cellNumber: DataType.INTEGER
}, {
instanceMethods : {
create : function(onSuccess, onError){
var name = this.name;
var lastName = this.lastName;
var email = this.email;
var gender = this.gender;
var cellNumber = this.cellNumber;
var password = this.password;
var shasum = crypto.createHash('sha1');
shasum.update(password);
password = shasum.digest('hex');
User.build({name: name, lastName: lastName, email: email, gender: gender, cellNumber: cellNumber, password: password})
.save().success(onSuccess).error(onError);
}
}
});
};
Я продолжаю получать эту ошибку в db[model.name] = модель:
TypeError: не удается прочитать свойство 'name' неопределенный
Были на этой ошибке в течение некоторого времени. любая помощь будет очень признательна
1 ответ:
Есть вероятность, что вы берете файл, не являющийся моделью, в каталоге
model
. Какие еще файлы у вас есть в этом каталоге? Вы только хотите импортировать файлы javascript, и ваш фильтр файлов недостаточно специфичен. Попробуйте заставить его обнаруживать только файлы javascript. Простой способ сделать это-проверить последние три символа имени файла и убедиться, что они.js
.(file.slice(-3) === '.js')
Добавьте его в файловый фильтр следующим образом:
.filter(function(file) { return (file.indexOf('.') !== 0) && (file !== "index.js") && (file.slice(-3) === '.js'); })
Еще одна причина, по которой это может быть неудача заключается в том, что экземпляр sequelize не создает экземпляр успешно и молчаливо терпит неудачу, прежде чем вы сможете фактически импортировать модели. Я использую что-то вроде этого, чтобы убедиться, что у меня есть подключение перед импортом:
var sequelize = new Sequelize(foo, bar, baz); sequelize.authenticate().then(function() { console.log('Database connected and authenticated!'); return true; }).catch(function(err) { console.error('Failed to connect and authenticate', err); return false; });
Если бы вы использовали что-то вроде этого, было бы легче обнаружить ошибки. Попробуйте поставить проверку базы данных над существующим кодом (или даже просто временно закомментировать код) и убедитесь, что вы действительно успешно подключились. Как только вы сможете подтвердить когда вы подключены, становится намного проще отлаживать странные вещи.
Примечание: Не оставляйте чек БД там, как только вы убедитесь, что он работает. это
Promise
и не очень хорошо работает с синхронными функциями, такими какfs.readdirSync()
.