Express router.param 和 router.route 如何定义 URL 参数名称?
How do Express router.param and router.route work in terms of defining URL parameter names?
我使用 Express 创建了一个路由器文件。回调函数驻留在它们离散的“控制器”文件中。以下是与我的问题相关的部分摘录,省略了控制器功能的require
行:
const express = require('express');
const router = express.Router();
// This should run first
router.param('coolParamName', validateParamBeforeHandlingReqs);
// Param name is ↑↑↑↑↑ "consumed" here, although NOT defined yet
// This should run after the above code
router.route('/').get(getAllUserNames).post(createUser);
router.route('/:coolParamName').get(getUserName).patch(updateUser).delete(deleteUser);
// Param name is ↑↑↑↑↑ defined here, and was consumed earlier - how?
正如评论所解释的那样,参数名称似乎已在 底部 上定义为 coolParamName
,但被编写的代码“消耗”了 [=24] =]在上面。这对我来说感觉很奇怪,因为我觉得先定义然后再使用是很自然的-只有我吗?我是否编写了违反预期设计模式的代码?
我想了解 Express 如何定义参数的名称,以及 router.param
和 router.router
如何处理它们。
router.param('coolParamName')
实质上注册了一个回调,该回调将被调用任何路由(在该路由器中),该路由使用 :coolParamName
参数并匹配当前请求。在匹配包含 :coolParamName
参数的请求的路由之前,每个请求都会调用一次回调。
它有点像匹配参数的中间件。它允许您在路由中匹配特定参数时自动配置一些设置代码。
您也可以通过在该特定路由上使用一个中间件或者甚至只是在路由处理程序中调用一个函数来完成同样的事情。因此,如果您碰巧在多个路由中使用相同的参数,这只是一个很好的功能。
我使用 Express 创建了一个路由器文件。回调函数驻留在它们离散的“控制器”文件中。以下是与我的问题相关的部分摘录,省略了控制器功能的require
行:
const express = require('express');
const router = express.Router();
// This should run first
router.param('coolParamName', validateParamBeforeHandlingReqs);
// Param name is ↑↑↑↑↑ "consumed" here, although NOT defined yet
// This should run after the above code
router.route('/').get(getAllUserNames).post(createUser);
router.route('/:coolParamName').get(getUserName).patch(updateUser).delete(deleteUser);
// Param name is ↑↑↑↑↑ defined here, and was consumed earlier - how?
正如评论所解释的那样,参数名称似乎已在 底部 上定义为 coolParamName
,但被编写的代码“消耗”了 [=24] =]在上面。这对我来说感觉很奇怪,因为我觉得先定义然后再使用是很自然的-只有我吗?我是否编写了违反预期设计模式的代码?
我想了解 Express 如何定义参数的名称,以及 router.param
和 router.router
如何处理它们。
router.param('coolParamName')
实质上注册了一个回调,该回调将被调用任何路由(在该路由器中),该路由使用 :coolParamName
参数并匹配当前请求。在匹配包含 :coolParamName
参数的请求的路由之前,每个请求都会调用一次回调。
它有点像匹配参数的中间件。它允许您在路由中匹配特定参数时自动配置一些设置代码。
您也可以通过在该特定路由上使用一个中间件或者甚至只是在路由处理程序中调用一个函数来完成同样的事情。因此,如果您碰巧在多个路由中使用相同的参数,这只是一个很好的功能。