关于Nodejs中app.use和app.get的疑惑。

关于Nodejs中app.use和app.get的疑惑。

app.use([path], function)

Use the given middleware function, with optional mount path, defaulting to “/”. 这是app.use的官方说明。说明app.use这个是用来配置路径响应的。app.get以及app.post等等,功能不也是路由响应么?我不明白这两个有什么区别?尤其是执行顺序方面?当我访问localhost:3000的时候,是先调用app.use(function…)呢还是先调用app.get(’/’,…)呢。新手刚刚学习node.js,各位帮帮忙解解疑惑。


8 回复

当然可以!app.useapp.get 都是 Express 框架中的路由处理方法,但它们的作用和使用场景有所不同。接下来我将详细解释它们的区别,并提供一些示例代码来帮助你理解。

app.use

app.use 是一个全局中间件函数,用于注册在整个应用中通用的中间件。它可以被看作是一个“全局拦截器”,在请求到达具体的路由之前进行预处理或后处理。app.use 可以接受一个路径参数,表示该中间件仅在匹配到指定路径时才会执行。

示例代码

const express = require('express');
const app = express();

// 全局中间件,适用于所有请求
app.use((req, res, next) => {
    console.log(`Request Type: ${req.method}`);
    next();
});

// 特定路径中间件
app.use('/api', (req, res, next) => {
    console.log('This is a request for /api');
    next();
});

// 路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中:

  1. 当你访问 //api 时,都会首先经过全局中间件 app.use
  2. 如果访问 /api,则会进一步触发特定路径中间件 app.use('/api')

app.get

app.get 是一个路由处理函数,专门用于处理 GET 请求。它只会在请求路径与定义的路由相匹配时才会被调用。

示例代码

const express = require('express');
const app = express();

// 全局中间件
app.use((req, res, next) => {
    console.log(`Request Type: ${req.method}`);
    next();
});

// GET 路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

// POST 路由
app.post('/', (req, res) => {
    res.send('This is a POST request');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中:

  1. 当你访问 / 时,会首先经过全局中间件 app.use
  2. 然后,由于请求方法是 GET,因此会匹配到 app.get('/') 并执行相应的回调函数。

执行顺序

当一个请求到达服务器时,Express 会按以下顺序处理:

  1. 全局中间件(如果存在)。
  2. 特定路径中间件(如果存在)。
  3. 具体的路由处理函数(如 app.get, app.post 等)。

总结来说,app.use 通常用于全局中间件或特定路径中间件,而 app.get 专门用于处理 GET 请求。希望这些示例代码能帮助你更好地理解它们之间的区别和执行顺序。


以前没其他框架使用经验, 这个很头疼, 我也纠结过…

app.use 不是来处理请求的, 而是来加载处理请求的路由模块的参数. 比如这个例子: http://expressjs.com/guide.html

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(function(err, req, res, next){
  // logic
});

一个请求过来, 被 .use 写好的各个函数依次处理, 更准确说, 是从第一个开始处理, 到一个做一点操作, 也可能截断流程直接返回… 而 app.get 等等 HTTP 请求的操作, 统一在 app.routes 着一个模块里边 http://expressjs.com/api.html#app.routes 所以, 先调用应该是 app.use, 而 app.get 应该是属于被前者调用才对…

我的水平只能解释到这里了…

你这样一说,我好想明白了一点。多谢你了。 你能不能去看一下我发的另一个帖子,关于req.flash的问题。

我觉得这个也是不知道为什么。 我那样写以后,就无法访问 localhost:3000,连接很长时间都连接不上去。删掉

app.use(function(req,res,next){
  res.locals.user=req.session.user;
  res.locals.success=req.session.success;
  res.locals.error=req.session.error;
})

问题就没有了。

你没有next

…666 没next 这么low的问题,自己还找不出 请问有什么想法

app.use和app.get,app.post等等在express框架里面处理都是类似的,都是抽象成一个Layer(层),只是app.get这些的层比app.use的层稍微复杂一点.顺序方面的话,先注册的层在访问的时候先调用,调用next()到下一个匹配url的Layer

其实get只是use的一个实现,

app.useapp.get 都是 Express 框架中用于定义路由的方法,但它们的作用有所不同。

app.use 主要用于加载中间件函数。中间件函数可以对请求进行预处理或后处理,例如处理请求体、身份验证等。它可以应用于所有路由或者特定路径下的路由。当没有匹配到具体路径的路由时,app.use 定义的中间件也会被调用。

app.get 是一种特殊的路由处理程序,专门用来处理 HTTP GET 请求。它只会在匹配到 / 路径的 GET 请求时被调用。

下面是两个方法的使用示例:

const express = require('express');
const app = express();

// 中间件函数,处理所有路径的请求
app.use((req, res, next) => {
  console.log(`Request Type: ${req.method}`);
  next(); // 将请求传递给下一个中间件或路由处理程序
});

// 处理 GET 请求,路径为 '/'
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在这个例子中,当你访问 http://localhost:3000 时:

  1. 首先会触发 app.use 中间件,输出请求类型(GET)。
  2. 然后会触发 app.get 处理程序,返回 “Hello World!” 响应。

总结来说,app.use 更适合用于全局中间件处理,而 app.get 专门处理特定类型的路由。在实际应用中,你可以根据需求选择合适的路由处理方法。

回到顶部