2013-03-24 27 views
8

Tôi có một máy chủ JS Node cơ bản được thiết kế để sử dụng như một API, tôi đã tạo một bản ghi và mô-đun cơ sở dữ liệu và tôi đã bắt đầu thêm các mô-đun khác để xử lý các loại yêu cầu khác nhau.Express JS 'this' undefined sau khi định tuyến với app.get (..)

Tôi đang sử dụng Express.js và nút-mysql

Khi tôi ghé thăm /v1/group tôi nhận được lỗi sau -

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) ... 

Vì vậy, tôi đoán sau recieving một yêu cầu và kêu gọi group.getAll() rằng this là undefined nhưng tôi không hiểu tại sao, có cách nào để thiết lập this hoặc có cấu trúc ứng dụng của tôi tất cả sai?

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; 

Trả lời

20

Bạn cần phải gắn đúng chức năng.

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

chỉ vượt qua chức năng getAll như một handler, nhưng chức năng chính nó không có khái niệm về this. this được quyết định dựa trên ngữ cảnh bị ràng buộc hoặc dựa trên cách hàm được gọi. This blog post hữu ích cho việc hiểu cách hoạt động của bối cảnh chức năng.

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

Làm việc một cách hoàn hảo, cảm ơn rất nhiều, tôi có cấu trúc đúng cách hay tôi nên đi theo cách khác? – Sam

+0

@Sam Đó là một câu hỏi khó khăn hơn. Tôi chỉ muốn nghiên cứu, tìm một số bài đăng trên blog của những người khác đã viết API và xem những gì hoạt động tốt nhất. Tôi chắc rằng có một số dự án về github mà bạn có thể tìm thấy. Tôi đã không làm nhiều công việc API nên tôi không thể nói nhiều. – loganfsmyth

+0

Tôi đã thực hiện một chút công bằng về nghiên cứu nhưng mọi người dường như có cách làm việc hơi khác trong Node. Tôi đoán tôi sẽ đi theo cách này và xem điều gì sẽ xảy ra, miễn là không có điều gì đó không ổn với việc triển khai của tôi, cảm ơn rất nhiều – Sam

Các vấn đề liên quan