[英]What is the best way to implement roles and permission in Express REST Api
[英]Best Way to Use OOP in Express REST API?
我全力以赴,僅使用節點做項目。 它很有趣,但有時我會迷失一點,我想在我感到困惑的時候嘗試獲得理解,所以我正確地構建它並且不要太過於不知所措。 無論如何,這是問題所在:
我有使用Express和mysql的REST API。 我設置了mysql:
//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'));
然后我包括我的路線,傳遞路線應用程序和登錄中間件,以便我可以在路線中使用它們:
var userRoute = require('./routes/users.js')(app,log);
app.use('/users', userRoute);
這實際上有點令人困惑,但現在我明白了,我必須將它們傳遞給模塊才能讓模塊獲取數據。
然后在我的路徑文件中,我想使用一個對象,以便我可以在其他路由中使用相同的功能,但在用戶文件中,為了使用其他所有使用的相同連接池,或者至少不必設置再次連接我必須傳遞響應和請求? 必須有一個更好的方法來做到這一點。 這樣真的很難看。 這是相關部分
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);
...
};
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。
var User = require('../controllers/user.js');
var userRouter = express.Router();
userRouter.post("/register", User.register);
module.exports = userRouter;
所以我們在這里所做的就是消除了對app / log中間件的依賴。
這意味着您的主文件(我通常稱之為app.js)將如下所示:
var userRouter = require('./routes/users.js');
app.use('/users', userRouter);
這也是您可以放置您選擇的任何中間件(日志記錄,正文解析,錯誤處理等)的地方。
在Express的更高版本中,上面的代碼實際上將我們的userRouter安裝到“/ users”。 在這種情況下,您現在將擁有“/ users / register”路由。
所以既然我們已經取出了路由器的一些邏輯,我們必須把它放在某個地方。 通常路由器會與控制器通信,所以讓我們來看看:
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的樣子:
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相關的邏輯放在我們的連接池中的地方。
/*
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.