gpt4 book ai didi

javascript - 使用 app.get(..) 路由后 Express JS 'this' 未定义

转载 作者:IT老高 更新时间:2023-10-28 23:18:22 25 4
gpt4 key购买 nike

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

我正在使用 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 是未定义的,但我不明白为什么,有没有办法设置 this 还是我的应用程序结构都错了?

服务器.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();
});

数据库.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;

最佳答案

你需要正确绑定(bind)函数。

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

只将getAll函数作为handler传递,而函数本身并没有this的概念。 this 是根据绑定(bind)的上下文或函数调用方式决定的。 This blog post对于理解函数上下文是如何工作的很有用。

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

关于javascript - 使用 app.get(..) 路由后 Express JS 'this' 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com