के साथ रूटिंग के बाद अपरिभाषित है मेरे पास एक मूल नोड जेएस सर्वर है जिसे एपीआई के रूप में उपयोग करने के लिए डिज़ाइन किया गया है, मैंने एक लॉग और डेटाबेस मॉड्यूल बनाया है और मैंने शुरू किया है विभिन्न अनुरोध प्रकारों से निपटने के लिए अन्य मॉड्यूल जोड़ना।एक्सप्रेस जेएस 'यह' 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;
पूरी तरह से काम किया, बहुत बहुत धन्यवाद, क्या मैं इसे सही तरीके से संरचित कर रहा हूं या क्या मुझे इसके बारे में एक और तरीके से जाना चाहिए? – Sam
@ सैम यह एक कठिन सवाल है। मैं सिर्फ शोध कहूंगा, कुछ ब्लॉग पोस्ट्स को अन्य लोगों द्वारा ढूंढें जिन्होंने एपीआई लिखी है और देखें कि सबसे अच्छा क्या काम करता है। मुझे यकीन है कि जिथूब पर कुछ परियोजनाएं हैं जिन्हें आप पा सकते हैं। मैंने बहुत एपीआई काम नहीं किया है इसलिए मैं ज्यादा नहीं कह सकता। – loganfsmyth
मैंने थोड़ा सा शोध किया है लेकिन हर कोई नोड में चीजों को करने का थोड़ा अलग तरीका प्रतीत होता है। मुझे लगता है कि मैं इस तरह से जाऊंगा और देखें कि क्या होता है, जब तक कि मेरे कार्यान्वयन के साथ कुछ गड़बड़ न हो, धन्यवाद – Sam