簡體   English   中英

REST路由多個文件節點js

[英]REST routing multiple files node js

我正在嘗試使用node jsexpress為我的數據庫設置REST api

現在,我一直是分而治之的愛好者,因此,我對REST api in node j創建REST api in node j時會得到的冗余代碼和龐大的服務器文件有些不高興。

以用戶表上的CRUD操作為例:

    // IMPORT ROUTES
// =============================================================================
var router = express.Router();

// on routes that end in /users
// ----------------------------------------------------
router.route('/user')

// create a user (accessed at POST http://localhost:8080/api/users)
    .post(function (req, res) {

        var username = req.body.username; //bodyParser does the magic
        var password = req.body.password;

        var user = User.build({username: username, password: password});

        user.add(function (success) {
                res.json({message: 'User created!'});
            },
            function (err) {
                res.status(err).send(err);
            });
    })

// get all the users (accessed at GET http://localhost:8080/api/users)
    .get(function (req, res) {
        var user = User.build();

        user.retrieveAll(function (users) {
            if (users) {
                res.json(users);
            } else {
                res.status(401).send("User not found");
            }
        }, function (error) {
            res.status("User not found").send('user not found');
        });
    });


var User = sequelize.define('user', {
        id: DataTypes.INTEGER,
        username: DataTypes.STRING,
        password: DataTypes.STRING,
        name: DataTypes.STRING,
        organization_id: DataTypes.INTEGER,
        type_id: DataTypes.INTEGER,
        join_date: DataTypes.STRING,
        image_path: DataTypes.STRING,
        status_id: DataTypes.INTEGER

    }, {    freezeTableName: true,
            instanceMethods: {
            retrieveAll: function (onSuccess, onError) {
                User.findAll({}, {raw: true})
                    .ok(onSuccess).error(onError);
            },
            retrieveById: function (user_id, onSuccess, onError) {
                User.find({where: {id: user_id}}, {raw: true})
                    .success(onSuccess).error(onError);
            },
            add: function (onSuccess, onError) {
                var username = this.username;
                var password = this.password;

                var shasum = crypto.createHash('sha1');
                shasum.update(password);
                password = shasum.digest('hex');

                User.build({username: username, password: password})
                    .save().ok(onSuccess).error(onError);
            },
            updateById: function (user_id, onSuccess, onError) {
                var id = user_id;
                var username = this.username;
                var password = this.password;

                var shasum = crypto.createHash('sha1');
                shasum.update(password);
                password = shasum.digest('hex');

                User.update({username: username, password: password}, {where: {id: id}})
                    .success(onSuccess).error(onError);
            },
            removeById: function (user_id, onSuccess, onError) {
                User.destroy({where: {id: user_id}}).success(onSuccess).error(onError);
            }
        }
}
);

// on routes that end in /users/:user_id
// ----------------------------------------------------
router.route('/users/:user_id')

// update a user (accessed at PUT http://localhost:8080/api/users/:user_id)
    .put(function (req, res) {
        var user = User.build();

        user.username = req.body.username;
        user.password = req.body.password;

        user.updateById(req.params.user_id, function (success) {
            console.log(success);
            if (success) {
                res.json({message: 'User updated!'});
            } else {
                res.send(401, "User not found");
            }
        }, function (error) {
            res.send("User not found");
        });
    })

// get a user by id(accessed at GET http://localhost:8080/api/users/:user_id)
    .get(function (req, res) {
        var user = User.build();

        user.retrieveById(req.params.user_id, function (users) {
            if (users) {
                res.json(users);
            } else {
                res.status(401).send("User not found");
            }
        }, function (error) {
            res.send("User not found");
        });
    })

// delete a user by id (accessed at DELETE http://localhost:8080/api/users/:user_id)
    .delete(function (req, res) {
        var user = User.build();

        user.removeById(req.params.user_id, function (users) {
            if (users) {
                res.json({message: 'User removed!'});
            } else {
                res.status(401).send("User not found");
            }
        }, function (error) {
            res.send("User not found");
        });
    });

現在這僅適用於一張桌子。

因此,我認為必須有更好的方法來組織所有這些工作?

所以我的問題是,您可以將每條路由分成一個單獨的文件嗎,有沒有一種方法可以簡化數據的路由/收集,從而消除冗余?

這是我的方法:

//controllers/someController.js
var express = require('express');
var router = express.Router();

router.post('/something', function(req, res, next) {
    ...
});
router.get('/something', function(req, res, next) {
    ...
});

module.exports = router;

//server.js
var app = require('express')();
var someController = require('./controllers/someContoller');
app.use('/some', someController);

因此,基本上,我創建了一個中間件,該中間件將在指定的路徑上處理請求。 您甚至可以通過迭代擁有的所有控制器文件並要求它們來簡化此過程,但我喜歡這樣:)

更新:

您可以將依賴項直接傳遞給控制器​​:

//someController.js
module.exports = function(express) {
   var router = express.Router();

   router.get('', function() {});

   return router;  
}

//server.js
var app = require('express')();
var someController = require('./controllers/someContoller')(express);
app.use('/some', someController);

暫無
暫無

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

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