APIとして使用するように設計された基本的なNode JSサーバーがあります。ログとデータベースモジュールを作成しました。異なる要求タイプを処理するための他のモジュールを追加する。Express JS 'this'はapp.get(..)でルーティングした後に未定義です
私は/v1/group
を訪れたとき、私は次のエラーを取得するExpress.jsを使用して、ノード-mysqlの
よ -
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) ...
だから私はthis
が未定義であることを要求が供給と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;
私はこれを正しい方法で構造化しているのですか、それとも別の方法で行っていますか? – Sam
@Samこれは厳しい質問です。私はちょうど研究を言うと、APIを書いた他の人がブログの投稿を見つけ、何が最もうまくいくかを見ていきます。私はあなたが見つけることができるgithubのいくつかのプロジェクトがあると確信しています。私は多くのAPIの作業をしていないので、あまり言わない。 – loganfsmyth
私はかなりの研究をしましたが、誰もがノードでやり方を少しずつ違う方法を持っているようです。私はこのように行って何が起こるかを見て、私の実装で何かがうまくいけば間違っていない限り、非常にありがとう – Sam