2016-02-03 5 views
5

के साथ पुनर्प्राप्त करें मैं नोडजेस और सीक्वेलिज़ ओआरएम फ्रेमवर्क के लिए नया हूं। मैं इसे mysql के साथ काम करने की कोशिश कर रहा हूं। मैंने कुछ बड़ी प्रगति की है लेकिन फिलहाल मैं उस हिस्से में फंस गया हूं जहां मॉडल में लोड करने की आवश्यकता है। लेकिन मुझे एक त्रुटि मिल रही है जहां फ़ाइल से नाम पुनर्प्राप्त किया गया है।सीईक्विलाइज़ के लिए मॉडल नाम को 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); 
     } 
    } 
    }); 
}; 

मैं db [model.name] = मॉडल पर इस त्रुटि प्राप्त हो रही:

TypeError: Cannot read property 'name' of undefined

थोड़ी देर के लिए इस त्रुटि पर रहा है। किसी भी मदद की सराहना की जाएगी

उत्तर

3

एक मौका है कि आप model निर्देशिका में एक गैर-मॉडल फ़ाइल चुन रहे हैं। उस निर्देशिका में आपके पास अन्य फाइलें क्या हैं? आप केवल जावास्क्रिप्ट फ़ाइलों को आयात करना चाहते हैं और आपका फ़ाइल फ़िल्टर पर्याप्त विशिष्ट नहीं है। केवल जावास्क्रिप्ट फ़ाइलों का पता लगाने के लिए इसे मजबूर करने का प्रयास करें। ऐसा करने का एक आसान तरीका फ़ाइल नाम के अंतिम तीन वर्णों की जांच करना और यह सुनिश्चित करना है कि वे .js हैं।

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

तो जैसे फ़ाइल फिल्टर करने के लिए यह करें:

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

एक अन्य कारण वह असफल हो सकता है कि sequelize के कहने सफलतापूर्वक instantiating नहीं है और चुपचाप इससे पहले कि आप वास्तव में मॉडल आयात कर सकते हैं में नाकाम रहने के है । मैं सुनिश्चित करने के लिए मैं आयात करने से पहले कनेक्टिविटी है कुछ इस तरह का उपयोग करें:

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() जैसे तुल्यकालिक कार्यों के साथ अच्छी तरह से खेल नहीं है।

+1

आपके वर्णनात्मक उत्तर के लिए धन्यवाद। इससे बहुत मदद मिली। आप डीबी चेक डालने की सिफारिश करेंगे? app.js में? –

+0

बेशक! मैं खुश हूं कि मैं मदद कर सका! ईमानदारी से कि डीबी चेक फ़ंक्शन कहीं भी चलाया जा सकता है, इसका एकमात्र उद्देश्य यह सत्यापित करना है कि आपके पास डेटाबेस से कनेक्टिविटी है। यह मूल रूप से केवल यह सत्यापित करने के लिए एक सरल क्वेरी 'चयन 1 + 1' चलाता है और यह सुनिश्चित करने के लिए करता है कि यह क्या कर सकता है। मैं इसे कहीं भी मौजूदा अनुशंसा नहीं करता लेकिन जहां आप अपने आवेदन को बूटस्ट्रैप करते हैं। – Pierce

संबंधित मुद्दे