在Node.js/Express中连接中间件

6
以下是一个Node.js/Express Web服务器的简单示例:
var express = require('express');
var app = express();
 
app.get('/*', function(req, res){
   res.end('Hello, you requested ' + req.url + '.');
});

app.listen(3000);

当程序运行时,请求http://localhost:3000/Hello-world将会生成响应。
Hello, you requested /Hello-world.

为了学习中间件,我想重新实现这个服务器,但是使用中间件将“获取数据”、“操作数据”和“输出数据”包含在单独的函数中。我尝试了以下方法,但对于这段代码,请求http://localhost:3000/Hello-world没有响应。只有app.get(..)代码似乎被执行。
var express = require('express');
var app = express();

// Step 1: get input
app.get('/*', function(req, res){
   req['testing'] = req.url;
});

// Step 2: manipulate data
app.use('/*', function(req, res, next) {
   req['testing'] = 'Hello, you requested ' + req['testing'];
   return next();
});

// Step 3: send output  
app.use('/*', function(req, res, next) {
    res.end(req['testing']);
    return next();
});

app.listen(3000);

似乎有些东西缺失,连接这些函数在一起的是什么呢?

1个回答

4
//This needs to be MIDDLEWARE not a route handler
// Step 1: get input
app.use(function(req, res, next){
   req.testing = req.url;
   next();
});

// Step 2: manipulate data
app.use(function(req, res, next) {
   req.testing = 'Hello, you requested ' + req.testing;
   next();
});

// Step 3: send output  
app.get('/*', function(req, res) {
    res.end(req.testing);
});

谢谢。这个可行!所以,如果我理解正确的话:app.use函数在任何请求时都会被调用,并且按照它们被调用的顺序执行(因此,在执行步骤2之前会先执行步骤1)。app.getGET请求时执行,这些请求会在之后执行。 - user2692274
1
一个很好的解释也在https://dev59.com/_moy5IYBdhLWcg3wMLOj。 - user2692274
通常情况下,GET请求会在路由器执行时被执行,你可以通过app.use(app.router)进行调整。通常它会放在错误处理路由之前的倒数第二个位置,但是Express很容易让你把路由器放得太早而导致出现问题。 - Peter Lyons
谢谢你解释这个问题。这对我很有帮助。 - user2692274

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接