mysql

2016-02-03 10 views
5

ile Sequelize için model adını geri alın. Nodejs ve Sequelize ORM framework'üne yeniyim. Ben mysql ile çalışmak için çalışıyorum. Bazı büyük ilerlemeler kaydettim ama şu anda modellerin sıralı hale getirilmesi gereken kısımda takılıyorum. Ama ismin dosyadan alındığı bir hatayı alıyorum.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); 
     } 
    } 
    }); 
}; 

ben [model.name] = modeli db de bu hatayı almaya devam:

TypeError: Cannot read property 'name' of undefined

Bu hata bir süredir devam ediyor. Herhangi bir yardım

cevap

3

için teşekkür ederiz model dizininde model olmayan bir dosya seçmeniz ihtimali vardır. Bu dizinde başka hangi dosyalarınız var? yalnızca javascript dosyalarını içe aktarmak istiyorsunuz ve dosya filtreniz yeterince spesifik değil. Sadece javascript dosyalarını algılamak için zorlamayı deneyin. Bunu yapmanın basit bir yolu, dosya adının son üç karakterini kontrol etmek ve .js olduklarından emin olmaktır.

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

şöyle dosya filtresine ekleyin:

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

o başarısız olabilir diğer nedeni sequelize örneği aslında modellerini içe aktarabilmek başarısız sessizce başarıyla başlatmasını ve olmamasıdır . Ben ithalat önce bağlantı sağlamak için böyle bir şey kullanın:

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

böyle bir şey kullanmak olsaydı daha kolay hataları noktaya yapacak. Veri tabanı kontrolünü mevcut kodunuzun üzerine koymaya çalışın (ya da sadece kodunuzu geçici olarak yorumlayın) ve gerçekten başarılı bir şekilde bağlandığınızı doğrulayın. Bağlandığınızı onayladıktan sonra, tuhaf şeyleri ayıklamak çok daha kolay.

Not:Çalıştığını onayladıktan sonra DB denetimini burada bırakmayın.Promise ve fs.readdirSync() gibi senkron işlevlerle iyi çalışmıyor. Tanımlayıcı yanıtınız için

+1

teşekkürler. Çok yardımcı oldu. db çekini nereye koymanızı önerirsiniz? app.js’de –

+0

Elbette! Yardım edebileceğime sevindim! Dürüst olmak gerekirse, db kontrol işlevi her yerde çalıştırılabilir, tek amacı veritabanına bağlandığınızı doğrulamaktır. Temel olarak, sadece gerekenleri yapabildiğinden emin olmak için 'SELECT 1 + 1' adlı basit bir sorguyu çalıştırır ve çalıştırır. Uygulamanızı önyükleme yaptığınız yerde, ancak önyükleme yaptığınız yerde önermem. – Pierce