2016-02-03 13 views
5

Sono nuovo a nodejs e al framework Sequelize ORM. Sto cercando di farlo funzionare con mysql. Ho fatto dei grandi progressi ma al momento sono bloccato nella parte in cui sequelize ha bisogno di caricare nei modelli. Ma sto ricevendo un errore in cui il nome viene recuperato dal file.Impossibile recuperare il nome del modello per Sequelize con mysql

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); 
    }); 
}); 

index.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; 

user.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); 
     } 
    } 
    }); 
}; 

Continuo a ricevere questo errore al db [model.name] = modello:

TypeError: Cannot read property 'name' of undefined

Sono stati su questo errore da un po 'ora. qualsiasi aiuto sarebbe molto apprezzato

risposta

3

C'è una possibilità che stai raccogliendo un file non di modello nella directory model. Quali altri file hai in quella directory? Tu solo vuoi importare file javascript e il tuo filtro di file non è abbastanza specifico. Prova a forzarlo a rilevare solo i file javascript. Un modo semplice per farlo è controllare gli ultimi tre caratteri del nome del file e accertarsi che siano .js.

(file.slice(-3) === '.js') 

Aggiungere al filtro di file in questo modo:

.filter(function(file) { 
    return (file.indexOf('.') !== 0) && (file !== "index.js") && (file.slice(-3) === '.js'); 
}) 

Un altro motivo potrebbe essere fallendo è che l'istanza di sequelize non è istanziare con successo e in silenzio in mancanza prima di poter effettivamente importare i modelli . Io uso qualcosa di simile per garantire ho connettività prima dell'importazione:

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; 
}); 

Se si sceglie di usare qualcosa come questo sarebbe rendere più facile individuare gli errori. Prova a mettere il controllo del database sopra il codice esistente (o anche solo commentare temporaneamente il tuo codice) e conferma che ti stai effettivamente connettendo con successo. Una volta che puoi confermare che sei connesso, diventa molto più facile eseguire il debug di cose strane.

Nota:Non lasciare il controllo DB in là una volta che si conferma che funziona. È un Promise e non funziona bene con le funzioni sincrone come fs.readdirSync().

+1

grazie per la tua risposta descrittiva. Ha aiutato molto. dove consiglieresti di mettere il controllo db? in app.js? –

+0

Naturalmente! Sono felice di poterti aiutare! Onestamente, la funzione di controllo db può essere eseguita ovunque, il suo unico scopo è verificare la connettività al database. Fondamentalmente si limita ad autenticare ed esegue una semplice query 'SELECT 1 + 1' per assicurarsi che possa fare ciò di cui ha bisogno. Non consiglierei di esistere ovunque, ma dove si avvia la tua applicazione. – Pierce

Problemi correlati