You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:01:23