2017-01-19 13 views
1

ルーティングが失敗した理由をトラッキングする際に問題が発生しました。私はSequelizeとExpressルーティングの新機能です。SequelizeとExpressを使用したAPIルーティングでエラーが発生しました

ゴール - APIエンドポイント '/ v1/agent /:id'にアクセスする際に、SequelizeクエリからJSON応答を返したいとします。私はすでにクエリが動作することを確認し、Agentモデルにマップされた1つの行を返します。

アプリを起動すると、ノードからRouter.use() requires middleware function but got a ' + gettype(fn));例外が発生します。例外はinitializeDb関数から来ていますが、理由はわかりません。 /路線から

import http from 'http'; 
import bodyParser from 'body-parser'; 
import express from 'express'; 
import sequelize from 'sequelize'; 
import config from './config'; 
import routes from './routes'; 

let app = express(); 
app.server = http.createServer(app); 

app.use(bodyParser.json({ 
    limit:config.bodyLimit 
})); 

app.use('/v1', routes); 

app.server.listen(config.port); 

console.log('API listening on port ' + app.server.address().port); 

export default app; 

マイindex.jsファイル:

import express from 'express'; 
    import config from '../config'; 
    import initializeDb from '../db'; 
    import agent from '../controller/agent' 
    // handle db configs 
    let router = express(); 

    initializeDb(db => { 

     router.use('/agent', agent({config, db})); 

    }); 

    export default router; 

エージェントモデルのための私のコントローラ:

import sequelize from 'sequelize'; 
import { Router } from 'express'; 
import Agent from '../model/agent'; 


export default({config, db}) => { 
    let api = Router(); 

    //query for the agent 
    api.post('/:id', (req, res) => { 
    sequelize 
     .query(
     "SELECT agentnum AS agentno,fname,lname,agentname AS full_name,[status] FROM my_table WHERE agentnum='" + req.params.id + "'", {model:Agent}) 
     .then(function(agent) { 
      console.log(agent); 
      res.json(agent); 
     }); 
    }); 
} 

、最終的にはここで

は、ルートindex.jsです、モデルagents.js

import sequelize from '../db'; 

let agent = function(sequelize, DataTypes) { 
    sequelize.define('agent', { 
     agentnum: { 
     type: DataTypes.STRING, 
     primaryKey: true, 
     allowNull: false 
     }, 
     fname : DataTypes.STRING, 
     lname : DataTypes.STRING, 
     fullname : DataTypes.STRING, 
     status : DataTypes.STRING 

    }, { 
     tableName: 'Base', 
     schema: 'Master', 
     freezeTableName: true, 
     timestamps: false 
    }); 


}; 


module.exports = agent; 

これで目の2番目の目を入れたい人は誰ですか?

+0

エラーを再現しました。問題はroutes.jsのミドルウェアの呼び出しにあるようです。 index.jsでルートミドルウェアをどのように使用するかを見てみましょう。ソリューションについてはまだ作業中ですが、これは役に立ちますか? –

+0

私は、あなたがセットアップで関数をexcecuteすると、定義されていない、そしてそれがチェーンを壊すという事実と関係があると信じています。ちょっと考えました –

+0

Youre on何か。私の後継クエリは、db.jsから呼び出すと動作しますが、initializeDb(importステートメント)から参照しようとすると失われます –

答えて

1

express.useがroutes.jsで正しく動作するように、agent.jsからapiオブジェクトを戻す必要があります。

これはSequelizeとは関係がないので、私が動作している例から外しました。見てみましょう。

import express from 'express'; 
import agent from './agent'; 

// handle db configs 
let app = express(); 

app.use('/agent', agent('config','database')); 

export default app; 

agent.js

import {Router} from 'express'; 

export default(config, db) => { 

    let api = Router(); 

    api.get('/:id', (req, res, next) => { 
    console.log('config', config); 
    console.log('db', db); 
    res.send('GET'); 
    }); 

    api.post('/:id', (req, res, next) => { 
    console.log('config', config); 
    console.log('db', db); 
    res.send('POST'); 
    }); 

    return api; 
}; 

routes.jsは、コンソールログはちょうどあなたがダウンして渡された値を見ることができるので、メンターされています。

+1

はい。フェイスパミング。 Sequelizeはまだ失敗していますが、少なくともルートは正しいです。ありがとうございました! –

関連する問題