Express JS'this'未定义后用app.get(..) [英] Express JS 'this' undefined after routing with app.get(..)

查看:143
本文介绍了Express JS'this'未定义后用app.get(..)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基本的Node JS服务器,它被设计为用作API,我创建了一个日志和数据库模块,我已经开始添加其他模块来处理不同的请求类型。



我使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆