请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

每次请求都会经过所有中间件吗?如果是的话路由配置也是每次请求也是这样吗?为什么listen可以放在最后,

const path = require("path");
const jsonServer = require("json-server");
const router = require("./router");
const TokenService = require("./service/token");
const db = require("./db")();

const server = jsonServer.create();

const middlewares = jsonServer.defaults({
  static: path.join(__dirname, "../public"),
});
server.use(middlewares);
// req.body
server.use(jsonServer.bodyParser);
// 鉴权
server.use((req, res, next) => {
  if (TokenService.isAuthorized(req)) {
    next();
  } else {
    res.sendStatus(401);
  }
});

server.use((req, res, next) => {
  const json = res.json.bind(res);
  res.success = (data) => {
    return json({
      code: 0,
      msg: "请求成功",
      data,
    });
  };
  res.fail = (msg, code = -1, data) => {
    return json({
      code,
      msg,
      data,
    });
  };
  next();
});
//创建了一个新的函数 json,它与 res.json() 具有相同的功能,但是在调用时不需要提供上下文对象(即 this),
//因为它已经通过 bind 方法绑定到了 res 对象上。这样做的好处是,你可以将这个新函数 json 传递给其他函数或方法,而无需担心上下文对象的问题。

router(server);
const jsonRouter = jsonServer.router(db);
server.use((req, res, next) => {
  setTimeout(next, 1000);
});
server.use("/api", jsonRouter);

server.listen(8555, () => {
  console.log("JSON Server is running at 8000");
});

每次请求的时候都设置下静态资源的地址?
每次请求的时候都新增res.success方法和res.fail方法两个方法吗?
每次请求都会经过所有中间件吗?
如果是的话路由配置也是每次请求也是这样吗?
如果都是按照顺序执行,为什么listen可以放在最后?

正在回答 回答被采纳积分+3

1回答

提问者 秋得法 2024-03-21 11:38:57

确实

server.use(middlewares);这个是每次请求的时候都设置下静态资源的地址

因为res.success方法和res.fail方法是在一个中间件中执行的,并且使用了 server.use() 方法注册,所以它会在每个请求到达服务器时都执行,从而导致每个请求都会新增这两个方法。


如果都是按照顺序执行,为什么listen可以放在最后?”

在 Node.js 中,HTTP 服务器是事件驱动的,它使用事件循环来处理请求。当你调用 `server.listen(port)` 启动服务器时,实际上是告诉 Node.js 开始监听指定的端口,并在有新的连接时触发 `connection` 事件。

在 Express、JSON Server 这样的框架中,通过 `server.use()` 方法注册的中间件会在请求到达服务器之后但在路由处理之前执行。这是因为 Express、JSON Server 在底层都是构建在 Node.js 的 HTTP 模块之上,利用了它的事件机制。当请求到达服务器时,Node.js 会触发一个 `request` 事件,服务器内部的中间件和路由处理函数都是绑定在这个事件上的。

因此,尽管 `server.listen()` 方法是在代码的最后调用的,但在启动监听端口之前,所有的中间件已经被注册,并且在请求到达时会按顺序执行。这是因为在事件驱动的模型中,`server.listen()` 只是告诉服务器开始监听端口,并不会阻塞代码的执行,后续的代码(包括中间件的注册)会继续执行。

在 Express 和类似框架中,路由通常也是作为中间件来处理的,但它们有些许不同。


如果是的话路由配置也是每次请求也是这样吗?

当你在 Express 中使用 `app.get()`、`app.post()` 等方法来定义路由时,实际上你正在注册一个处理特定路径的中间件。这些路由中间件会在请求到达时被 Express 匹配,并且只有在请求的路径与路由路径匹配时才会被执行。因此,即使路由在每次请求时都会被检查,但它们并不是每次请求都会生成新的。一旦路由中间件被注册,它们就会一直存在于应用程序的路由中,直到应用程序关闭或者它们被明确地删除。

举个例子,当你使用 `app.get('/users', (req, res) => { /* 处理 /users 路径的请求 */ })` 来定义一个路由时,这个路由中间件就会被注册到 Express 应用程序中,并且在每次收到请求时都会被检查。但它不会在每次请求时重新生成,而是被创建一次,然后一直存在于应用程序中,直到应用程序关闭。

所以,虽然路由中间件在每次请求时都会被检查,但它们并不是每次请求都会生成新的。


0 回复 有任何疑惑可以回复我~
  • 提问者 秋得法 #1
    express 中是否用对象存储了路由的路径,然后对请求做比对判断?
    
    ChatGPT
    是的,Express 中确实使用了对象来存储路由的路径,并在收到请求时对这些路由进行比对判断,以确定应该由哪个路由处理函数来处理请求。
    
    Express 中的路由系统是基于路径的,你可以使用 app.get()、app.post()、app.put() 等方法来定义不同 HTTP 方法的路由,并指定对应的处理函数。这些方法内部会将路由路径和处理函数存储在一个对象中,形成路由映射表。
    
    当 Express 接收到一个 HTTP 请求时,会根据请求的方法和路径来查找匹配的路由处理函数。它会遍历路由映射表,找到与请求路径最匹配的路由,并调用对应的处理函数来处理请求。
    
    例如,当你定义了一个路由:
    
    javascript
    Copy code
    app.get('/api/users', function(req, res) {
      // 处理 GET /api/users 请求的逻辑
    });
    当收到一个 GET 请求,路径为 /api/users 时,Express 就会匹配到这个路由,并调用对应的处理函数来处理请求。这样就实现了路由的功能,将请求分发到相应的处理函数中去。
    
    
    
    
    User
    路由映射表是什么样子
    ChatGPT
    路由映射表在 Express 中是一个用来存储路由信息的数据结构,通常是一个对象。这个对象会将路由路径映射到对应的处理函数上,以便在接收到 HTTP 请求时能够根据请求的路径找到相应的处理函数进行处理。
    
    一个简单的路由映射表可能是这样的:
    
    javascript
    Copy code
    {
      '/': [handler1, handler2],
      '/api/users': [handler3],
      '/api/posts': [handler4, handler5],
      // 更多路由映射...
    }
    在这个示例中,对象的键是路由的路径,而值是一个数组,存储了与该路径匹配的一个或多个处理函数。当 Express 接收到一个 HTTP 请求时,会遍历这个对象,找到与请求路径最匹配的路由,并执行对应的处理函数。
    
    在实际的应用中,这个路由映射表会根据你在 Express 应用中定义的路由进行动态更新和维护。每次调用 app.get()、app.post() 等方法来定义路由时,Express 都会将对应的路由信息添加到这个映射表中。这样,在收到请求时,Express 就能够根据这个映射表来快速找到匹配的路由并处理请求。
    回复 有任何疑惑可以回复我~ 2024-04-25 11:41:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信