簡體   English   中英

在Express REST API中使用OOP的最佳方式?

[英]Best Way to Use OOP in Express REST API?

我全力以赴,僅使用節點做項目。 它很有趣,但有時我會迷失一點,我想在我感到困惑的時候嘗試獲得理解,所以我正確地構建它並且不要太過於不知所措。 無論如何,這是問題所在:

我有使用Express和mysql的REST API。 我設置了mysql:

app.js

//Variables, move these to env
var dbOptions = {
    host: config.db_config.host,
    user: config.db_config.user,
    password: config.db_config.password,
    port: config.db_config.port,
    database: config.db_config.database
};
app.use(myConnection(mysql, dbOptions, 'single'));

然后我包括我的路線,傳遞路線應用程序和登錄中間件,以便我可以在路線中使用它們:

app.js cont。

var userRoute = require('./routes/users.js')(app,log);
app.use('/users', userRoute);

這實際上有點令人困惑,但現在我明白了,我必須將它們傳遞給模塊才能讓模塊獲取數據。

然后在我的路徑文件中,我想使用一個對象,以便我可以在其他路由中使用相同的功能,但在用戶文件中,為了使用其他所有使用的相同連接池,或者至少不必設置再次連接我必須傳遞響應和請求? 必須有一個更好的方法來做到這一點。 這樣真的很難看。 這是相關部分

路線/ users.js

var User = require('../controllers/User.js');

module.exports = (function(app,log) {
var userR = express.Router();

userR.post('/register', function(req,res){
        var email = req.body.email;
        var password = req.body.password;
        var firstName = req.body.first_name;
        var lastName = req.body.last_name;
        var userId;

        try {
            var query;
            var status = 200;
            var response = '';

            var newUser = {
                email: email,
                password:password,
                first_name: firstName,
                last_name: lastName,
                password: password
            };

            var user = new User(req,res);

            user.register(newUser);
...

};

控制器/ user.js的

module.exports = function User(req,res) {
this.id = 0;
    this.register = function(newUser){

        var _this = this;
        var deferred = q.defer();
req.getConnection(function(err,connection){
...

必須有一種我在這里缺少的模式。 我應該能夠傳遞應用程序或其他東西,並有權訪問req.getConnection等。

謝謝。

這里有很多事情要發生,但我會對這個問題采取一些措施。

我的第一個建議是盡量讓你的路由器保持苗條。 它沒有標記,但我假設您提供的最大代碼片段是您的路由器。 當然有很多意見,但如果我這樣做,這就是我的路由器的樣子。 我假設你正在使用Express 4x。

路線/ users.js

var User = require('../controllers/user.js');
var userRouter = express.Router();
userRouter.post("/register", User.register);
module.exports = userRouter;

所以我們在這里所做的就是消除了對app / log中間件的依賴。

這意味着您的主文件(我通常稱之為app.js)將如下所示:

app.js

var userRouter = require('./routes/users.js');
app.use('/users', userRouter);

這也是您可以放置​​您選擇的任何中間件(日志記錄,正文解析,錯誤處理等)的地方。

在Express的更高版本中,上面的代碼實際上將我們的userRouter安裝到“/ users”。 在這種情況下,您現在將擁有“/ users / register”路由。

所以既然我們已經取出了路由器的一些邏輯,我們必須把它放在某個地方。 通常路由器會與控制器通信,所以讓我們來看看:

控制器/ user.js的

var User = require("../models/user.js")
var register = function(req, res, next){
    var email = req.body.email;
    var password = req.body.password;
    var firstName = req.body.first_name;
    var lastName = req.body.last_name;
    var userId;
    var params = {
            email: email,
            password:password,
            first_name: firstName,
            last_name: lastName,
            password: password
        };
    var newUser = new User(params);

    try {
       newUser.register();
        // do other things...
    }
};
module.exports = {register: register};

你會注意到的第一件事是我會有一個UserModel文件。 通過這樣做,我們從這條路線中解耦了我們的模型對象。 比方說,我們有一個新的注冊路由(可能其中一個有一個電子郵件+ pw,另一個通過FB注冊,我們必須存儲不同的東西)。 我們應該能夠使用我們模型中指定的相同函數(在本例中為user.register),而無需更改大量內容!

現在,這是UserModel的樣子:

/models/user.js

var connection = require("../lib/connection.js");
var User = function(params){
   this.email = params.email;
   // ...etc
};

User.prototype.register = function(newUser){
    connection.getConnection(function(error, connection){
        //connection.doWhatever();
    });
};

module.exports = User;

現在我們終於找到了問題的核心。 在頂部,您會看到我們有一個連接文件。 這就是我們將所有與DB相關的邏輯放在我們的連接池中的地方。

/lib/connection.js

/*
This will be in some JSON config we'll say
var dbOptions = {
    host: config.db_config.host,
    user: config.db_config.user,
    password: config.db_config.password,
    port: config.db_config.port,
    database: config.db_config.database
};

*/
//This will depend on which version/module/db you're using, but here's what mine looks like
var MySQL = require("mysql");
var config = require("../config/db.json");
connectionPool = MySQL.createPool({host: config.db_config.host, ...});

var getConnection = function(done){
   connectionPool.getConnection(done);
};

module.exports = {getConnection: getConnection};

因此,總而言之,我們現在只需將我們的短連接模塊包含在我們所處的模型文件中,請提供連接,並進行我們需要的任何處理,而不是將您的連接與請求對象一起傳遞。 另請注意,您必須將連接釋放回池中,但我會將其作為練習留給您:)。

另外,我通常會寫CoffeeScript,所以請原諒任何小錯誤。 如果您需要進一步澄清,請與我們聯系。

干杯,布倫南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM