Не могу получить имя модели для 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 6

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().