2016-03-01 28 views
2

我剛剛進入Express,並注意到我看到的路由和中間件的每個示例都使用匿名函數。下面是從快遞網站的例子:Express JS - 使用匿名函數路由和中間件

router.get('/user/:id', function(req, res){ 
    res.send('user ' + req.params.id); 
}); 

我想知道,如果有,爲什麼我沒有看到使用函數聲明,而不是任何人的理由。這樣的事情:

router.get('/user/:id', getUserById); 

function getUserById(req, res) { 
    res.send('user ' + req.params.id); 
} 

我的問題很大程度上是因爲我與約翰帕帕的角度styleguide的經驗。在書中,他建議您使用提升你的優勢,因爲在這了: https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#style-y053

他基本上是主張在定義自己的「API」在頂部的角度服務,讓您可以快速查看的訪問成員服務而不用除去實施。如果使用函數聲明,我可以看到與路由相同的潛力。當你在一個視圖中,不能記不清楚了URL必須符合特定的路線,你可以打開用戶

router.get('/user/:id', getUserById); 
router.get('/users', getAllUsers); 
router.delete('/user', deleteUser); 
router.put('/user/:id', updateUser); 

function getUserById(req, res) { 
    res.send('user ' + req.params.id); 
} 

function getAllUsers(req, res) { 
    // implement get all users 
} 

function deleteUser(req, res) { 
    // implement delete user 
} 

function updateUser(req, res) { 
    // implement update user 
} 

這樣:你可能有一個用戶路由文件是這樣的。 js文件並快速查看頂部的所有可用端點。沒有向下滾動找到你需要的端點。

是否有一個令人信服的理由不這樣做,或者我沒有看到更好的方法?

+2

不,不是真的。創建使用匿名函數的示例非常簡單。請記住,這只是JavaScript,你習慣使用的原則仍然適用。 –

+3

這主要是自以爲是的。就個人而言,我更願意將我的路由功能與我的實際路由分開。所以我將在不同的文件中使用命名函數引用,使用帶有app.use'的快速中間件來應用路由器。 –

+0

@SterlingArcher你說得對,這絕對是關於意見的,這是我覺得奇怪的一個原因,我沒有看到任何人分享他們如何構建他們的路線。感謝你分享你的想法。 – developering

回答

1

這是快遞有點MVC風格 - 的方式,我通常做如下(爲示例用戶API):

文件夾佈局:

app.js 
controllers/ 
    usersController.js 
models/ 
    User.js 
routes/ 
    userRoutes.js 

app.js

var userRoutes = require('./routes/userRoutes') 
// Tell express to use the userRoutes for all requests starting'/user' 
app.use('/user', userRoutes') 

/routes/userRoutes.js

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

// localhost:PORT/user 
router.get('/', userController.getAll) 
router.get('/:id', userController.getById); 

/controllers/userController.js

var User = require('../models/User.js') 

exports.getAll = (req, res, next) => { 
// find all users 
    User.find({}, ...) 
} 

exports.getById = (req, res, next) => { 
    // req.params.id, then find by ID 
} 

這只是一個例子,你可以使用,如果你喜歡只是一個單一的路線文件,也可以創建適用於UserController中的對象,然後導出它,如果你喜歡。

Express爲您提供了很大的靈活性,可以幫助您構建應用程序,最終它取決於您的偏好 - 沒有「正確」或「錯誤」的方法。

+0

謝謝阿什利!看到一個對別人來說很好的例子很有幫助。感謝您分享。 – developering

+0

小錯字,@ashley;我認爲你的第二條路線應該是'router.get('/:id',userController.getById);'在最常見的用途中。 – Paul

+0

很高興我能幫忙,我已經編輯了我的答案@保羅,謝謝你指出。 –