我有一个设计为用作API的基本Node JS服务器,我创建了一个日志和数据库模块,并开始添加其他模块来处理不同的请求类型。
我正在使用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
或构造我的应用程序都错了?
服务器
"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;
您需要正确绑定功能。
app.get('/v1/group', group.getAll);
仅将getAll
函数作为处理程序传递,但函数本身没有的概念this
。this
取决于绑定的上下文或函数的调用方式。这篇博客文章对于理解函数上下文如何工作很有用。
app.get('/v1/group', group.getAll.bind(group));
问题内容: 我有一个具有以下用于路由的代码的应用程序: 现在,我必须将路由代码放在不同的文件中,因此我尝试使用此方法,但是它可能 无法 工作,因为它代替了它,而使用了: 如何使用将路由放入不同的文件中? 为什么,,,等,都没有在工作使用后在其中? 问题答案: 这是一个简单的例子: 在这里, 将实例安装在 ,这样添加到实例的任何路由都将相对于。
为了定义辅助路由,我们必须首先添加一个命名的路由出口,其中要呈现辅助路由的内容。 接下来,我们必须定义到应用程序的辅助路由的链接,以导航和呈现内容。 每个辅助路由是独立的路由,可以拥有: 自己的辅助路由 自己的浏览器历史记录栈
将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product
使用路由既可以让之很复杂,同时也能让它很简单,这是归于你的应用。然而使用一个路由是很简单的,你可以添加你的路由协议给路由器,这样就OK了! 不同的路由协议如下所示: Yaf_Route_Simple Yaf_Route_Supervar Yaf_Route_Static Yaf_Route_Map Yaf_Route_Rewrite Yaf_Route_Regex 首先让我们来看看路由器是如何让路
问题内容: 我对正则表达式不太满意,因此我想确保自己正确执行了此操作。假设我有两条非常相似的路线,和。我想创建一个匹配这两个页面的路由。 这是正确的方法吗?现在,我只是在创建两条单独的路线。 问题答案: 作品
我想从API中读取要显示的产品。然后,当我按下其中一个显示的产品时,它应该使用url中的产品ID和要在页面上查看的产品详细信息将我路由到一个组件,以获取有关该产品的详细信息。我在这里读取了API中的数据,并详细显示了产品。 我想通过产品ID添加一个路由链接。如何将详细信息作为其他组件的道具发送?