Express JS'this'未定义后用app.get(..) [英] Express JS 'this' undefined after routing with app.get(..)
问题描述
我使用Express.js和node-mysql
当我访问 / v1 / group
我收到以下错误 -
TypeError:无法读取属性'database'未定义的
在Group.getAll(C:\code\javascript\\\
ode\api\api\v1\groups.js:12:23)
在回调(C:\\ \\ code\javascript\\\
ode\api\\\
ode_modules\express\lib\router\index.js:161:37)...
所以我猜到收到一个请求并调用 group.getAll()
这个这个
是未定义的,但我不明白为什么,有没有办法设置这个
或者我的应用程序结构错了?
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();
//初始日志和数据库
var log = new Log();
var database = new Database(dbConfig,log);
var initCallback = function(){
// Init routes
var group = new Group(database,log);
//组路由
app.get('/ v1 / group',group.getAll);
app.get('/ v1 / group /:id',group.getByID);
app.listen(3000);
log.logMessage(INFO,Listing on port 3000);
};
//测试数据库连接
database.getConnection(function(err,connection){
if(err){
log.logMessage(FATAL,连接到数据库时出错,检查数据库正在运行,dbconfig.json文件存在并且正确。);
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,使用主机连接到数据库 - + dbConfig.dbhost +,数据库端口 - + dbConfig.dbport +,数据库名称 - + dbConfig.dbname +,用户+ dbConfig.dbuser +,密码长度 - + dbConfig.dbpass.length);
this.pool = mysql.createPool({
host:dbConfig.dbhost,
user:dbConfig.dbuser,
port:dbConfig.dbport,
密码:dbConfig.dbpass,
数据库:dbConfig.dbname
});
};
Database.prototype.getConnection = function(){
var args = arguments;
return this.pool.getConnection.apply(this.pool,arguments);
};
module.exports =数据库;
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。发送(结果);
});
connection.end();
});
};
Group.prototype.getByID = function(req,res){
console.log(this);
res.send({name:Group Item 1});
};
module.exports = Group;
您需要正确绑定该功能。 >
app.get('/ v1 / group',group.getAll);
仅将 getAll
函数作为处理程序传递,但功能本身没有这个
的概念。 这个
是基于绑定的上下文决定的,或者基于函数的调用方式。 此博文是有助于了解功能上下文的工作原理。
app.get('/ v1 / group',group.getAll.bind(group));
I have a basic Node JS server which is designed to be used as an API, I've created a log and database module and I've started adding other modules to deal with different request types.
I'm using Express.js and node-mysql
When I visit /v1/group
I get the following error -
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) ...
So I guess after recieving a request and calling group.getAll()
that this
is undefined but I don't understand why, is there a way to set this
or have I structured my application all wrong?
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;
You need to properly bind the function.
app.get('/v1/group', group.getAll);
only passes the getAll
function as a handler, but the function itself has no concept of this
. this
is decided based on the context that is bound, or based on how the function is called. This blog post is useful for understanding how function context works.
app.get('/v1/group', group.getAll.bind(group));
这篇关于Express JS'this'未定义后用app.get(..)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!