Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express JS-对路由和中间件使用匿名函数_Javascript_Node.js_Express - Fatal编程技术网

Javascript Express JS-对路由和中间件使用匿名函数

Javascript Express JS-对路由和中间件使用匿名函数,javascript,node.js,express,Javascript,Node.js,Express,我刚刚进入Express,注意到我看到的每个路由和中间件示例都使用匿名函数。以下是express网站的一个示例: router.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); }); 我想知道为什么我没有看到任何人使用函数声明。大概是这样的: router.get('/user/:id', getUserById); function getUserById(req, res) { res

我刚刚进入Express,注意到我看到的每个路由和中间件示例都使用匿名函数。以下是express网站的一个示例:

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);
}
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
}
我的问题很大程度上是因为我与约翰·帕帕(John Papa)的有角度的风格指南的经验。在这篇文章中,他建议您使用起重设备来发挥自己的优势,如下所示:

他本质上主张在顶部为angular服务定义“API”,这样您就可以快速查看服务的可访问成员,而无需在实现中进行筛选。如果使用函数声明,我可以看到路由具有相同的潜力。您可能有如下用户路由文件:

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

function getUserById(req, res) {
  res.send('user ' + req.params.id);
}
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
}
这样,当您在视图中,无法准确记住url需要是什么来匹配特定路由时,您可以打开users.js文件,并在顶部快速查看所有可用的端点。无需向下滚动即可找到所需的端点


有没有令人信服的理由不这样做,或者我没有看到更好的方式?

这是一种有点MVC风格的Express-我通常这样做的方式如下(例如用户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
}
这只是一个示例,如果愿意,您可以只使用一个routes文件,或者您可以为userController创建一个对象,然后如果愿意,将其导出


Express为你的应用程序结构提供了极大的灵活性,最终取决于你的喜好——没有“正确”或“错误”的方法

不,不是真的。创建一个使用匿名函数的示例非常简单。记住,这只是javascript,您习惯使用的原则仍然适用。这主要是自以为是的。就我个人而言,我更喜欢将路由功能与实际路由分开。因此,我将在另一个文件中使用命名函数引用,使用express middleware with
app。使用
应用路由器。@SterlingArcher你是对的,这肯定是关于意见的,这也是为什么我觉得奇怪的一部分,我没有看到任何人分享他们如何构建路线。谢谢你分享你的想法。但是。。。这些路线只是功能。就像在浏览器中定义事件侦听器一样,您所做的只是添加一个回调,该回调将在以后调用。不管它是匿名函数还是命名函数,所有更改都是可读性/可维护性/可调试性。如果使用命名函数,则在跟踪错误时将返回函数名,而不是匿名函数。如果使用命名函数,则更容易重用和/或导出它。但是你也可以用匿名函数来做这些事情。在任何特定情况下,哪一个更好都是严格的意见。谢谢@KevinB。这就是为什么我想知道的一些原因。函数声明并不是给它命名的唯一方法,但它的好处是让你把事情放在逻辑上有意义的地方。听起来答案是这是JS,所以就这样对待它吧。不必担心是否有什么神奇的“快捷方式”可以做到这一点。谢谢艾希礼!看一个例子,说明什么对其他人有效,这是很有帮助的。谢谢你的分享。小字体,@ashley;我认为您的第二条路径应该是
router.get('/:id',userController.getById)最常用。很高兴我能帮上忙,我编辑了我的答案@Paul,谢谢你指出这一点。