2013-03-24 17 views
8

APIとして使用するように設計された基本的なNode JSサーバーがあります。ログとデータベースモジュールを作成しました。異なる要求タイプを処理するための他のモジュールを追加する。Express JS 'this'はapp.get(..)でルーティングした後に未定義です

私は/v1/groupを訪れたとき、私は次のエラーを取得するExpress.jsを使用して、ノード-mysqlの

よ -

TypeError: Cannot read property 'database' of undefined 
    at Group.getAll (C:\code\javascript\node\api\api\v1\groups.js:12:23) 
    at callbacks (C:\code\javascript\node\api\node_modules\express\lib\router\index.js:161:37) ... 

だから私はthisが未定義であることを要求が供給とgroup.getAll()を呼び出した後推測私は理由を理解していない、thisを設定する方法があるのですか、私のアプリケーションをすべて間違って構成しましたか?

sever.js

"use strict"; 

var Express = require('express'); 
var Log = require('./database/log'); 
var Database = require('./database/database'); 
var dbConfig = require('./dbconfig.json'); 

var Group = require('./api/v1/groups'); 


//Init express 
var app = new Express(); 

//Init log and database 
var log = new Log(); 
var database = new Database(dbConfig, log); 

var initCallback = function() { 
    //Init routes 
    var group = new Group(database, log); 

    //Group routes 
    app.get('/v1/group', group.getAll); 
    app.get('/v1/group/:id', group.getByID); 

    app.listen(3000); 
    log.logMessage("INFO", "Listening on port 3000"); 
}; 

//Test database connection 
database.getConnection(function(err, connection) { 
    if (err) { 
     log.logMessage("FATAL", "Error connecting to database, check database is running and the dbconfig.json file is present and correct."); 
     process.exit(1); 
    } 
    connection.end(); 

    initCallback(); 
}); 

database.js

"use strict"; 

var mysql = require('mysql'); 


var Database = function(dbConfig, log) { 
    this.connected = false; 
    this.log = log; 

    this.log.logMessage("INFO", "Connecting to database with: Host - " + dbConfig.dbhost + ", Database port - " + dbConfig.dbport + ", Database name - " + dbConfig.dbname + ", User " + dbConfig.dbuser + ", Password length - " + dbConfig.dbpass.length); 

    this.pool = mysql.createPool({ 
     host : dbConfig.dbhost, 
     user : dbConfig.dbuser, 
     port: dbConfig.dbport, 
     password : dbConfig.dbpass, 
     database: dbConfig.dbname 
    }); 
}; 

Database.prototype.getConnection = function() { 
    var args = arguments; 
    return this.pool.getConnection.apply(this.pool, arguments); 
}; 

module.exports = Database; 

あなたが適切に機能をバインドする必要がgroups.js

"use strict"; 

var Group = function(database, log) { 
    this.database = database; 
    this.log = log; 
}; 

Group.prototype.getAll = function(req, res) { 
    console.log(this); // --> undefined 

    var query = 'SELECT * FROM invgroups WHERE published = 1'; 

    this.database.getConnection(function(err, connection) { // --> error line 
     if (err) { res.send(500, "Database error"); } 

     connection.query(query, function(err, results) { 
      if (err) { res.send(500, "Database error"); } 
      res.send(results); 
     }); 

     connection.end(); 
    }); 

}; 


Group.prototype.getByID = function(req, res) { 
    console.log(this); 
    res.send({name: "Group Item 1"}); 
}; 

module.exports = Group; 

答えて

20

app.get('/v1/group', group.getAll); 

は唯一のハンドラとしてgetAll機能を渡しますが、機能自体はthisの概念がありません。 thisは、バインドされたコンテキストに基づいて決定されるか、またはその関数がどのように呼び出されるかに基づいて決定される。 This blog postは、関数のコンテキストの仕組みを理解するのに便利です。

app.get('/v1/group', group.getAll.bind(group)); 
+0

私はこれを正しい方法で構造化しているのですか、それとも別の方法で行っていますか? – Sam

+0

@Samこれは厳しい質問です。私はちょうど研究を言うと、APIを書いた他の人がブログの投稿を見つけ、何が最もうまくいくかを見ていきます。私はあなたが見つけることができるgithubのいくつかのプロジェクトがあると確信しています。私は多くのAPIの作業をしていないので、あまり言わない。 – loganfsmyth

+0

私はかなりの研究をしましたが、誰もがノードでやり方を少しずつ違う方法を持っているようです。私はこのように行って何が起こるかを見て、私の実装で何かがうまくいけば間違っていない限り、非常にありがとう – Sam

関連する問題