关于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,各位帮帮忙解解疑惑。
当然可以!app.use
和 app.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');
});
在这个例子中:
- 当你访问
/
或/api
时,都会首先经过全局中间件app.use
。 - 如果访问
/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');
});
在这个例子中:
- 当你访问
/
时,会首先经过全局中间件app.use
。 - 然后,由于请求方法是 GET,因此会匹配到
app.get('/')
并执行相应的回调函数。
执行顺序
当一个请求到达服务器时,Express 会按以下顺序处理:
- 全局中间件(如果存在)。
- 特定路径中间件(如果存在)。
- 具体的路由处理函数(如
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
app.use和app.get,app.post等等在express框架里面处理都是类似的,都是抽象成一个Layer(层),只是app.get这些的层比app.use的层稍微复杂一点.顺序方面的话,先注册的层在访问的时候先调用,调用next()到下一个匹配url的Layer
其实get只是use的一个实现,
app.use
和 app.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
时:
- 首先会触发
app.use
中间件,输出请求类型(GET)。 - 然后会触发
app.get
处理程序,返回 “Hello World!” 响应。
总结来说,app.use
更适合用于全局中间件处理,而 app.get
专门处理特定类型的路由。在实际应用中,你可以根据需求选择合适的路由处理方法。