2016-02-03 2 views
5

私はnodejsとSequelize ORMフレームワークを初めて使用しています。私はそれをmysqlで動作させようとしています。私はいくつかの大きな進歩を遂げましたが、現時点では、後編がモデルにロードされる必要がある部分に悩まされています。しかし、名前がファイルから取得される場所でエラーが発生しています。mysqlでSequelizeのモデル名を取得する

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

WWW私はデシベル[model.name] =モデルで、このエラーを取得しておきます

TypeError: Cannot read property 'name' of undefined

しばらくこのエラーが発生しました。どんな助けがあれば幸いです。

答えて

3

modelディレクトリのモデルではないファイルを取得している可能性があります。そのディレクトリには他にどのようなファイルがありますか?あなたのみ JavaScriptファイルをインポートして、ファイルフィルタが十分ではありません。 javascriptファイルのみを検出するようにしてください。これを行う簡単な方法は、ファイル名の最後の3文字を確認し、それらが.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; 
}); 

:私は、インポートする前に、接続性を持っていることを確認するために、このようなものを使用します。既存のコードの上にデータベースのチェックを入れてみてください。(あるいは一時的にコードをコメントアウトして)実際に接続が成功していることを確認してください。接続されたことを確認できれば、奇妙なものをデバッグするのがはるかに簡単になります。

注:有効であることを確認してからDBチェックを残しないでください。Promiseであり、fs.readdirSync()のような同期関数ではうまく動作しません。

+1

ご回答いただきありがとうございます。それは多くの助けとなりました。 dbチェックをどこに置くことをお勧めしますか? app.jsにありますか? –

+0

もちろん!私は助けることができてうれしい!正直なところ、db check関数はどこでも実行できますが、その唯一の目的はデータベースへの接続性を確認することです。基本的には単純な認証「SELECT 1 + 1」を認証して実行し、必要な処理を実行できることを確認します。私はあなたのアプリケーションをどこにブートストラップするのかはわかりません。 – Pierce

関連する問題