Tôi có một máy chủ JS Node cơ bản được thiết kế để sử dụng như một API, tôi đã tạo một bản ghi và mô-đun cơ sở dữ liệu và tôi đã bắt đầu thêm các mô-đun khác để xử lý các loại yêu cầu khác nhau.Express JS 'this' undefined sau khi định tuyến với app.get (..)
Tôi đang sử dụng Express.js và nút-mysql
Khi tôi ghé thăm /v1/group
tôi nhận được lỗi sau -
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) ...
Vì vậy, tôi đoán sau recieving một yêu cầu và kêu gọi group.getAll()
rằng this
là undefined nhưng tôi không hiểu tại sao, có cách nào để thiết lập this
hoặc có cấu trúc ứng dụng của tôi tất cả sai?
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;
Làm việc một cách hoàn hảo, cảm ơn rất nhiều, tôi có cấu trúc đúng cách hay tôi nên đi theo cách khác? – Sam
@Sam Đó là một câu hỏi khó khăn hơn. Tôi chỉ muốn nghiên cứu, tìm một số bài đăng trên blog của những người khác đã viết API và xem những gì hoạt động tốt nhất. Tôi chắc rằng có một số dự án về github mà bạn có thể tìm thấy. Tôi đã không làm nhiều công việc API nên tôi không thể nói nhiều. – loganfsmyth
Tôi đã thực hiện một chút công bằng về nghiên cứu nhưng mọi người dường như có cách làm việc hơi khác trong Node. Tôi đoán tôi sẽ đi theo cách này và xem điều gì sẽ xảy ra, miễn là không có điều gì đó không ổn với việc triển khai của tôi, cảm ơn rất nhiều – Sam