2013-03-24 13 views
8

के साथ रूटिंग के बाद अपरिभाषित है मेरे पास एक मूल नोड जेएस सर्वर है जिसे एपीआई के रूप में उपयोग करने के लिए डिज़ाइन किया गया है, मैंने एक लॉग और डेटाबेस मॉड्यूल बनाया है और मैंने शुरू किया है विभिन्न अनुरोध प्रकारों से निपटने के लिए अन्य मॉड्यूल जोड़ना।एक्सप्रेस जेएस 'यह' app.get (..)

मैं Express.js और नोड mysql का उपयोग कर रहा

जब मैं यात्रा कर /v1/group मैं निम्नलिखित त्रुटि मिलती है -

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

तो मैं एक अनुरोध प्राप्त करने और बुला group.getAll() कि this अपरिभाषित है के बाद लगता है कि लेकिन मुझे समझ में नहीं आता है, क्यों 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

@ सैम यह एक कठिन सवाल है। मैं सिर्फ शोध कहूंगा, कुछ ब्लॉग पोस्ट्स को अन्य लोगों द्वारा ढूंढें जिन्होंने एपीआई लिखी है और देखें कि सबसे अच्छा क्या काम करता है। मुझे यकीन है कि जिथूब पर कुछ परियोजनाएं हैं जिन्हें आप पा सकते हैं। मैंने बहुत एपीआई काम नहीं किया है इसलिए मैं ज्यादा नहीं कह सकता। – loganfsmyth

+0

मैंने थोड़ा सा शोध किया है लेकिन हर कोई नोड में चीजों को करने का थोड़ा अलग तरीका प्रतीत होता है। मुझे लगता है कि मैं इस तरह से जाऊंगा और देखें कि क्या होता है, जब तक कि मेरे कार्यान्वयन के साथ कुछ गड़बड़ न हो, धन्यवाद – Sam

संबंधित मुद्दे