表示JS'这个'未定义后路由与app.get(..)

我有一个基本的Node JS服务器,被devise为一个API使用,我创build了一个日志和数据库模块,我已经开始添加其他模块来处理不同的请求types。

我正在使用Express.js和node-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是未定义的,但我不明白为什么,有没有一种方法来设置或我的结构我的应用程序都是错的?

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; 

您需要正确绑定该function。

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

只传递getAll函数作为处理程序,但函数本身没有this概念。 this是根据绑定的上下文来决定的,也可以根据函数的调用方式来决定。 这篇博客文章对理解函数上下文是如何工作很有用的。

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