NodeJS 如何在Expressjs中命名路由

klsxnrf1  于 2023-08-04  发布在  Node.js
关注(0)|答案(3)|浏览(110)

在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');
or
app.get('/login', AuthController.login, name='my route name'); 
...

output:
res.send(anyFunction('my route name')) // => /api/auth/login | https://example.com/api/auth/login

字符串
任何示例或文档。谢啦,谢啦

更新03/08/2023

虽然我对它并不完全满意(我最初的意图是找到一个像Laravel这样的全自动解决方案),但我可以接受它。我根据Answers的建议编写了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"}


我希望我能得到比这更好的东西

5vf7fwbs

5vf7fwbs1#

您可以添加一个middleware,它在res的locals属性上添加路由名称。像这样的-

const middleware = async (req, res, next) => {
      switch(req.path){
        case "/api/auth/login":
          res.locals["route-name"] = "My Route Name";
          break;
        // Other case statements
      }
next();
}

字符串
在你的控制器里,你可以-

res.send(myFunction(res.locals["route-name"]));

2nc8po8w

2nc8po8w2#

首先,你必须创建一个单独的路由文件,导入你的所有控制器。
在你的app.ts中添加代码(我假设这是你的主文件)

import routes from './routes/routes';

// Register routes
app.use('/', routes);

字符串
并添加您的路由器代码如下所示:routes.ts

import { Router } from "express";
let controller = require("../controller/yourController");
let router = Router();
let apiRouter = Router();

apiRouter.get('/download-errorlog', controller.getErrorLogFile);

apiRouter.post('/get-data', controller.getData);

// Define the API endpoint
router.use('/api/v1', apiRouter);
export default routes;

mdfafbf1

mdfafbf13#

你应该添加一个新的功能。这个函数返回你想要的路由的原始url。

export default (name) => {
  const mainUrl = "https://example.com"
  switch (name) {
    case "my route name":
      return `${mainUrl}/api/auth/login`;
    .
    .
    .
    default:
      return null;
  }
};

字符串
然后,将函数导入到auth.controller.ts

// auth.controller.ts

res.send(getUrl("my route name")); // => https://example.com/api/auth/login

相关问题