路由匹配简写

来源:5-6 初始化路由

Just90

2020-08-12

在 app.js 中不需要去获取 url 和 path,获取 path 的目的是全局匹配路径。但是有些请求是不携带参数的,比如 /api/blog/list 表示获取全部博客。这时通过 res.url.split('?')[0] 虽然能返回/api/blog/list ,但是讲不通,他没有 ‘?’, 所以不存在通过 ‘split’ 切割,然后获取数组第一个元素。
我们可以在直接 blog.js 中,通过 req.url.includes('/api/blog/list') 来判断是否匹配上了路由。如下:
blog.js:

const handleBlogRouter = (req, res) => {
  const method = req.method;

  // 博客列表
  if (method === 'GET' && req.url.includes('/api/blog/list')) {
    return {
      msg: '博客列表接口',
    };
  }

  // 博客详情
  if (method === 'GET' && req.url.includes('/api/blog/detail')) {
    return {
      msg: '博客详情接口',
    };
  }

  // 新建一条博客
  if (method === 'POST' && req.url.includes('/api/blog/new')) {
    return {
      msg: '新建博客接口',
    };
  }

  // 更新博客
  if (method === 'POST' && req.url.includes('/api/blog/update')) {
    return {
      msg: '更新博客接口',
    };
  }

  // 删除一条博客
  if (method === 'POST' && req.url.includes('/api/blog/delete')) {
    return {
      msg: '删除博客接口',
    };
  }
};

module.exports = handleBlogRouter;

app.js

const handleBlogRouter = require('./src/router/blog');
const handleUserRouter = require('./src/router/user');

const serverHandle = (req, res) => {
  res.setHeader('Content-type', 'application/json');

  const blogData = handleBlogRouter(req, res);
  if (blogData) {
    res.end(JSON.stringify(blogData));
    return;
  }

  const userData = handleUserRouter(req, res);
  if (userData) {
    res.end(JSON.stringify(userData));
    return;
  }

  res.writeHead(404, { 'Content-type': 'text/plain' });
  res.write('404 not found');
  res.end();
};

module.exports = serverHandle;

// env: process.env.NODE_ENV,
写回答

2回答

Narmo

2021-06-16

这种写法有问题,比如api/blog/list/xxx你就会匹配到api/blog/list的路由里去。虽然这个简单的项目是没问题,一旦复杂起来就会容易出现bug

0
0

双越

2020-08-12

嗯嗯,这样也可以。

0
0

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程