2016-03-01 42 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

很高兴我能帮忙,我已经编辑了我的答案@保罗,谢谢你指出。 –