如何在Express.js中为路由命名并通过名称获取对应URL?
在Express.js中如何为路由设置名称以通过名称获取URL?
我想在Express.js里给路由设置自定义名称,后续直接调用这个名称就能获取对应的URL,期望的用法示例如下:
// File app.ts: app.use('/api', apiRouter); // File api.ts: router.use('/auth', authRouter); // File auth.ts: router.get('/login', AuthController.login).as('my route name'); // 或者 app.get('/login', AuthController.login, name='my route name');
期望输出效果:
res.send(anyFunction('my route name')) // => /api/auth/login | https://example.com/api/auth/login
恳请提供相关示例或实现方案,感谢!
2023年8月3日更新
尽管我对当前实现并不完全满意(最初期望找到类似Laravel的全自动解决方案),但可以接受。我根据社区回答的建议编写了route.url.ts文件,具体实现如下:
route.url.ts
function replaceParams(urlReplace: string, params: { [key: string]: string } = {}): string { const queryParams: { [key: string]: string } = { ...params }; const url: string = urlReplace.replace(/:([a-zA-Z0-9]+)(\(.+?\))?/g, (match, paramName, regexPart) => { delete queryParams[paramName]; const regex = regexPart ? new RegExp(regexPart.slice(1, -1)) : null; return params[paramName] && (!regex || regex.test(params[paramName])) ? params[paramName].toString() : ':' + paramName; }); const queryString: string = Object.keys(queryParams) .map((key) => key + '=' + queryParams[key]) .join('&'); return queryString ? (url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`) : url; } export default (routeName: string, params: { [key: string]: string } = {}): string => { const appUrl: string = process.env.APP_URL || ''; switch (routeName) { case 'api.a': return replaceParams(`${appUrl}/api/a/:user_id`, params); case 'api.b': return replaceParams(`${appUrl}/api/b/:user_id([a-z0-9]+)`, params); case 'api.c': return replaceParams(`${appUrl}/api/c/`, params); default: return ''; } };
app.ts
app.get('/', function (req, res){ res.json({ a: routeUrl('api.a', { user_id: 'user12321423432' }), b: routeUrl('api.b', { user_id: 'user12321423432' }), c: routeUrl('api.c', { user_id: 'user12321423432' }) }); });
输出结果
{"a":"http://127.0.0.1:8000/api/a/user12321423432","b":"http://127.0.0.1:8000/api/b/user12321423432","c":"http://127.0.0.1:8000/api/c/?user_id=user12321423432"}
我希望能获得更优的解决方案。
内容的提问来源于stack exchange,提问作者HCode
相关产品推荐
相关产品推荐

