2017-01-24 4 views
1

のインスタンスを返さない状態:Sequelizeがsequelizeのドキュメント(<a href="http://docs.sequelizejs.com/en/v3/docs/raw-queries/" rel="nofollow noreferrer">http://docs.sequelizejs.com/en/v3/docs/raw-queries/</a>)モデル

If you pass a model the returned data will be instances of that model.

// Callee is the model definition. This allows you to easily map a query to a predefined model 
sequelize.query('SELECT * FROM projects', { model: Projects }).then(function(projects){ 
    // Each record will now be a instance of Project 
}) 

を私はagentというリソースのためのモデルを定義しています。

module.exports = function(sequelize, DataTypes) { 
    let Agent = sequelize.define('Agent', { 
     responseStatus: DataTypes.STRING, 
     agentnum: { 
     type: DataTypes.STRING, 
     primaryKey: true, 
     allowNull: false, 
     field : 'agentno' 
     }, 
     fname : { 
     type: DataTypes.STRING, 
     allowNull : false, 
     field: 'fname' 
     }, 
     lname : { 
     type: DataTypes.STRING, 
     allowNull: false, 
     field : 'lname' 
     }, 
     fullname : { 
     type: DataTypes.STRING, 
     allowNull : false, 
     field: 'full_name' 
     }, 
     status : { 
     type: DataTypes.STRING, 
     allowNull: false, 
     field: 'business_status' 
     }, 
     loginDate: DataTypes.DATE 
    }, { 
     freezeTableName: false, 
     timestamps: false 
    }); 

    return Agent; 
}; 

そして、私のクエリでsequelize.queryを呼び出し、モデルを指定する場合:sequelize\lib\dialects\abstract\query.js:675

TypeError: this.model.bulkBuild is not a function

スタックポイント:エージェントが、私はsequelizeからスローエラーが発生します。

このエラーは続くまでというクエリタイプを適用します。この時点でクエリが完了し、JSON応答が返されますが、エージェントモデルのインスタンスではありません。 sequelizeクエリのJSON応答には、マップする必要があるフィールド名が含まれています。

エクスプレスサンプル(https://github.com/sequelize/express-example/blob/master/models/index.js)に記載されている指示に従ってモデル(その1つ)をインポートしました。モデルコレクションには、エージェントモデルが含まれていることが示されています。

import Sequelize from 'sequelize'; 
import config from './config'; 

export default callback => { 
    const sequelize = new Sequelize(config.database, config.username, config.password, config.params); 

    sequelize.sync().then(function() { 
    let db = { } 

    let agentModel = sequelize.import('model/agent.js'); 
    db[agentModel.name] = agentModel; 

    db.sequelize = sequelize; 
    db.Sequelize = Sequelize; 

    db.sequelize.authenticate().then(function() { 
     console.log('CONNECTION OK'); 
    }); 


    callback(db); 

    }).catch(function(err) { 
    console.log('FAILED TO CONNECT: ', err.message); 
    }); 
} 

質問が実行されたとき(POSTからapiに呼び出されたとき)に、エージェントのインスタンスを返すようにします。私はMS SQL Server 2008 R2を使用しています。

ご了承ください。ありがとう。

EDIT 1/30ここでは、sequelizeオブジェクトを生成してモデルを渡すコードを示します。モデルコレクションは、自分のアイテムが追加されたことを示しますが、プロパティはありません。

connectDb: (function() { 
     var sequelize; 
     function createInstance() { 
      var sequelizeInstance, connectedAndAuthenticated; 
      sequelizeInstance = new Sequelize(config.database, config.username, config.password, config.params); 
      connectedAndAuthenticated = sequelizeInstance.authenticate(); 
      connectedAndAuthenticated.sequelize = sequelizeInstance; 
      connectedAndAuthenticated.Sequelize = Sequelize; 

      var model = sequelizeInstance.import('../src/model/agent.js'); 


      return connectedAndAuthenticated; 
     } 
     return { 
      getInstance : function() { 
       if (!sequelize) { 
        sequelize = createInstance(); 
       } 
       return sequelize; 
      } 
     }; 
    }()) 

EDIT 1/26QueryTypesを操作し、私は二つのことを発見した後 - 私は不注意モデル(エージェント)の名前のデータベースにテーブルを作成したこと、および返されるオブジェクトはtablenameを持っていること空のプロパティ値。 schematablenameは私によって指定されますが、多くのクエリとテーブルを結合するストアドプロシージャであるクエリは、Agentというデータベースのオブジェクトに直接マップされません。それは私には、は、クエリの結果にバインドされている自分のモデルを作成しているので、これは問題ではありませんはないと示唆していると言われています。あなたsequelize を使用するためにきれいな方法を説明する混乱.i'mは、あなたの質問ともプロジェクトに私に言ったようなモデルディレクトリはindex.jsが含まれていることを確認し、あなたのコードファイルに

var models = require('../models'); 

+0

クエリは何ですか? – Adam

+0

'db.sequelize .query( )「DECLARE @response VARCHAR(256); EXEC API_Login @agentnum = N '」+ agentNum +「'、@hashedPassword = '" + password + "'、@response = @response OUTPUT (エージェント); .spread(ファンクション(エージェント){ res.status(200).json(エージェント); }}) .catch(function(err){ handleError(err、res); }); 'これは呼び出されるストアドプロシージャです。 –

+0

'type:sequelize.QueryTypes.SELECT'を実行するとどうなりますか? – Adam

答えて

0

のような検索クエリを使用する必要があります接続を確認するためにあなたのコード で

models.sequelize.query("select 1 as val").then(function(result){ 
console.log(result) 
}) 

を置きます。私はAgentがあなたのスコープ内で実際に定義されているとは思わない。私はあなたがagentModelを渡すべきであると思うか、またはあなたが輸入に縛られたものであれ。

let agentModel = sequelize.import('model/agent.js');  
db.sequelize.query("DECLARE @response VARCHAR(256); EXEC API_Login @agentnum = N'" + agentNum + "', @hashedPassword = '" + password + "', @response = @response OUTPUT; SELECT @response AS N'response'",{ model: agentModel, type: sequelize.QueryTypes.RAW}) .spread(function(Agent) { res.status(200).json(Agent); }) .catch(function(err) { handleError(err, res); }); 

Agentは、コールバックの外で定義されていないので、私は{model: agentModel, ...}ない{model: Agent, ...}を使用しています注意してください。

エラーTypeError: this.model.bulkBuild is not a functionは、Agentが実際にモデルではなく、他のもの(または定義されていない)であれば理にかなっています。

UPDATEは

あなたはその下のコメント欄に言及: - それが必要」と「クエリが代わりにエージェントモデルに渡さへの結合、テーブルを作成しようと、私はモデルを同期しています」テーブルを作成しないでください "。

なぜそれがそうだと思いますか? sync()中にテーブルを作成すると、の正常な動作がSequelizeになります。

Sequelizeの仕組みを誤解していると思います。同期中に登録されたモデルごとにテーブルが作成されます。そのテーブルを作成できない場合、無効なモデルが返されている可能性があります。そのため、エラーが発生しています。

モデルは個別のデータベーステーブルに結びついていますが、それはSequelizeの基本的な動作です。各モデルインスタンスは、そのテーブルの行を表します。ストアドプロシージャを使用している場合は、ネイティブデータベースライブラリを使用し、独自の抽象レイヤーを定義する方がよいでしょう。

モデルと基礎となるDBテーブルの間のデフォルトの同期をすべて無効にしたり無効にしたりできますが、特定のポイントや複雑さでは、基本的には独自の抽象ライブラリを作成していて、最初からそれをやるだけです。

おそらく、あなたが望むようにSequelizeを使うことはできますが、少なくともsync()に電話するべきではありません。私につながると言うことはできませんが、私はあなたがあなた自身のbeforeSyncフックsync()を定義しない限りは、常にあなたのスキーマ内の表を作成すると言うことができるどのような副作用:

Model.prototype.sync = function(options) { 
    options = options || {}; 
    options.hooks = options.hooks === undefined ? true : !!options.hooks; 
    options = Utils._.extend({}, this.options, options); 

    var self = this 
    , attributes = this.tableAttributes; 

    return Promise.try(function() { 
    if (options.hooks) { 
     return self.runHooks('beforeSync', options); 
    } 
    }).then(function() { 
    if (options.force) { 
     return self.drop(options); 
    } 
    }).then(function() { 
    return self.QueryInterface.createTable(self.getTableName(options), attributes, options, self); 
    }) 
    ... 
    }).return(this); 
}; 
+0

エラーは依然として続きます。私は前にこれを試したことを明確にすべきだった。最初はコレクションのモデルの名前であると理解していました(これは 'エージェント'として定義されていますので、JSONではインスタンスではなく定義されたモデルの名前が必要です)。しかし、生のjsonを返すRaw以外のすべてのクエリ型で例外が発生します。 –

+0

console.debug(agentModel)を試して、実際に何が見たことがありますか?それはbulkBuildメソッドを持っていますか?また、ライブラリが実際にエージェントの_name_を望んでいる場合、それは変数 'Agent'(おそらく定義されていません)ではなく、文字列' 'Agent" ' – SpliFF

+0

はいです。 '{Agent:Agent}'のようなJSONオブジェクトです。プロパティは割り当てられません。意図的にパスを間違えてしまうと、アプリケーションが例外をスローするので、モデルファイルがロードされていますが、それ以外の点についてはこれで気づいています。 –

1

sequelizeドキュメントを置いていますモデル。 注意してください。それ以外のモデルでは正しく構成されていてはなりません。 は今もあなたはそれは、単純なタイプミスのように思える

models.Projects.findAll().then(function(result){ 
    console.log(result) 
    }) 
+0

うん、その混乱!しかし、これは受け入れられる答えではありません。私は既存のSQL Serverインスタンスに接続することができ、それに対してクエリを実行できます。私が把握できないことは、ドキュメントにモデルの名前を渡すことによって可能であることが示唆されているように見えるにもかかわらず、ストアドプロシージャの出力に既存のモデル(modelsディレクトリにある)をバインドすることです。 –

+1

データは、モデル名を使用したモデル呼び出しと自動的にバインドされます。私はあなたが混乱しているものは得られません。しかし、私はあなたがクラスまたはgetter&setterメソッドを探していると思います。 – shivshankar

+0

"データはモデル名を持つモデル呼び出しと自動的にバインドされます" - 私が言っているのはこれを行ったことです。モデルをモデルコレクションに手動で追加するだけでなく、クエリでモデルを指定することも試みましたが、自動的にはバインドされません。コレクションをチェックするとモデルが読み込まれます。代わりに、クエリ結果だけを返します。これは発見ではありません。私がドキュメントで読んだアイデアは、モデルを定義するだけで、クエリを実行すると、提供されたモデルにバインドされます。これは今はしません。私はドキュメントを誤解していますか? –

関連する問題