怎样给connect/express.js写中间件

本文介绍如何为Express.js编写中间件,包括中间件的基本概念、如何创建禁止特定IP地址访问的中间件模块,并展示了如何在Express.js应用中使用该中间件。

        如果你有想写属于自己的express.js中间件的想法,很可能你知道express.js实际上就是一个Connect(附带额外的特性),如果你还不知道它,或许你应该先静心地了解更多的Connect知识。

        如果你已经知道Connect是什么,并且想为它写一个中间件,那么你来对地方了。我将给展示怎样和express.js一起使用你自己崭新的中间件。

        在我们写中间间之前,我们需要知道它是什么。

        通常情况下,一个链接服务器的请求在HTTP response被生成前要经过一些方法。在连接期间这些方法按照惯例被称为“中间件”。这就是它,非常简单。

        使用Express.js或Connect,你可能遇到req,res和next对象们,中间件方法做它们的事情,如果需要并把req,res和next传给下一个线性排列的方法。这就是中间件的工作机制。

        中间件函数作为插件被放到请求流中(request flow),通过在Connnect里使用 connect.use(),或在express中使用app.use().看看这个Connect的服务例子:

var http = require('http');
var connect = require('connect');

var app = connect();
app.use(function(req, res) {
    res.end('Hello!');
});

http.createServer(app).listen(3000);
         这仅有一个中间件,每一个向服务器的请求,它仅仅打印出“hello!”。

         尽管中间件都是函数,可以通过connect.use()方法把它作为插件使用,为了代码的重用和整洁,最好将它们开发成一个node.js的模块,而不是在connect.use()里定义一个方法。

         让我们创建一个禁止IP地址的中间件模块,我们称它为 "ipban",创建一个名叫ipban.js的文件,里面存有以下内容:

// list of banned IPs
var banned = [
'127.0.0.1',
'192.168.2.12'
];

// the middleware function
module.exports = function() {
    
    return function(req, res, next) {
        if (banned.indexOf(req.connection.remoteAddress) > -1) {
            res.end('Banned');
        }
        else { next(); }
    }
    
};
          现在,修改下链接服务的代码来使用我们的中间件:

var ipban = require('./ipban.js');
var app = connect();
app.use(ipban());
app.use(function(req, res) {
    res.end('Hello!');
});
          运行app并且尝试在浏览器里加载。嗙!被禁止了!运行app并且尝试在浏览器里加载。嗙!被禁止了!
          接下来呢?一个自定义的中间件模块需要返回一个方法,这个方法理想情况下接受 req,res或next三个参数。

          你可能已经注意到当初始化一个中间件是大部分都接受配置选项。那么我们使ipban能够这样做也是自然的。通过传递“on”或者”off“,ipban 将会有效或者无效。

          修改ipban.js文件:

// list of banned IPs
var banned = [
'127.0.0.1',
'192.168.2.12'
];

// middleware enabled or not
var enabled = true;

// the middleware function
module.exports = function(onoff) {
    
    enabled = (onoff == 'on') ? true : false;
    
    return function(req, res, next) {
        if (enabled && banned.indexOf(req.connection.remoteAddress) > -1) {
            res.end('Banned');
        }
        else { next(); }
    }
    
};

          同样,使用方法也需要改变:

app.use(ipban('off'));
          重启app,在浏览器里加载,不再被禁止!

         如果你的中间件不是http请求的终点,确保调用next(),否则你将以一个挂起的应用而结束。

         如果用express.js来使用这个中间件,我们就要这样做:

var ipfilter = require('./ipfilter');
app.configure(function(){
    app.use(ipfilter('on'));
...

         注意:中间件的顺序是非常重要的,它能启动也能断开你应用。

         我希望这个例子能够帮助你理解中间件是什么和怎样去编写它们。在这篇文章里你还有什么不明白的吗?如需了解更多的关于中间件的知识,请在评论里联系我。

  原文: http://www.hacksparrow.com/how-to-write-midddleware-for-connect-express-js.html
原index.js文件:const express = require('express'); // 2. 创建一个 express 应用实例 const app = express(); // 3. 定义服务器的端口号 const port = 3000; // 4. 定义一个API接口:当有人访问根路径'/'时,我们如何回应 // req: request (收到的请求信息) // res: response (要发出去的回应信息) app.get('/', (req, res) => { // 我们回应一段文本 res.send('Hello, Feynman Learner!'); }); // 5. 启动服务器,让它开始监听指定的端口 app.listen(port, () => { console.log(`Feynman aPlatform backend is running at http://localhost:${port}`); }); 修改 `index.js` 文件,引入并使用我们新安装的工具。 ```javascript // index.js const express = require('express'); const mongoose = require('mongoose'); const cors = require('cors'); // 1. 引入cors require('dotenv').config(); const app = express(); const port = process.env.PORT || 3000; // 优先使用环境变量中的端口 // --- 核心中间件 --- // 2. 使用cors中间件 - 解决跨域问题 // 讲解:CORS (Cross-Origin Resource Sharing) 是一个必需的步骤。当我们的前端(比如运行在localhost:5173) // 尝试请求后端(运行在localhost:3000)时,浏览器会出于安全策略阻止它。 // `cors()` 中间件会自动添加必要的响应头,告诉浏览器“我允许那个地址的请求”,从而让前后端可以顺利通信。 app.use(cors()); // 3. 使用express.json()中间件 - 解析请求体 // 讲解:这个中间件让我们的Express应用能够识别并处理传入的JSON格式数据(比如用户注册时POST的用户名和密码)。 app.use(express.json()); // --- 数据库连接 --- mongoose.connect(process.env.MONGO_URI) .then(() => console.log('MongoDB connected successfully!')) .catch(err => console.error('MongoDB connection error:', err)); // ... (后续的API路由) app.listen(port, () => { console.log(`Feynman Platform backend is running at http://localhost:${port}`); }); ```
最新发布
09-27
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值