gpt4 book ai didi

node.js - NodeJS - 触发错误的 Express 路线

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:21 25 4
gpt4 key购买 nike

我有以下路线可用于后端...

admin.js

router.get('/contents', ...);  // GET /admin/contents

router.get('/:adminID', ...); // GET /admin/[adminID]

router.put('/:adminID', ...); // PUT /admin/[adminID]

router.get('/', ...); // GET /admin

router.post('/', ...); // POST /admin

..但在测试中,出现以下情况:

PUT /admin/contents

触发 PUT/admin/[adminID] 路由。但“内容”不是 ID。我理解为什么会发生这种情况(即它符合模式),但我不确定最好/常见的解决方案是什么?理想情况下,我希望它能够识别“内容”不是 ID,实际上只是尝试使用不可用的端点。

我可以使用类似的东西

router.use('/contents', require('./admin-contents'));

但我更愿意将每个顶级端点限制为单个文件,而不是将其分散到这么多文件中。

最坏的情况,它将查找 ID 为“contents”的管理员,并返回“未找到管理员”,但我更希望它返回 404,因为这不是 的可用端点/admin.

编辑#1

澄清一下,adminID 是字母和数字的组合,其中任意一个出现在字符串中的任何位置。正则表达式不起作用。

此外,/admin/contents 的唯一路由是GET。必须为所有其他方法(PUTPATCHDELETE 等)实现空白路由也并不理想。

最佳答案

您可以在路由中的参数名称后面提供正则表达式,以避免出现这种情况。

router.put('/:adminID(\\d+)', (req, res) => {
console.log(req.params.adminID); // I'm a number
});

现在adminID必须是数字,否则不会进入路由。

虽然express上没有直接记录routing ,因为 express 使用 path-to-regexp我们可以查看他们的文档:

它记录在Custom Matching Parameters

const regexpNumbers = pathToRegexp('/icon-:foo(\\d+).png')
// keys = [{ name: 'foo', ... }]

regexpNumbers.exec('/icon-123.png')
//=> ['/icon-123.png', '123']

regexpNumbers.exec('/icon-abc.png')
//=> null

更新

Your suggestion of checking for even just one number in a known-length string should work,

app.put('/:adminID((?:\\w+(?<=\\d+)(?:\\w+)?))', (req, res) => {
// I have at least 1 number
// I can have or not alpha-numeric characters
res.send(req.params.adminID);
});

正则表达式使用积极后向断言,自 Node.js 9.11.2 起,无需任何标志即可支持该断言。 。因此,如果您使用的是旧版本,请升级或使用 --harmony 标志来运行它。

关于node.js - NodeJS - 触发错误的 Express 路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55479838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com