javascript - 重新加载快速中间件的正确方法是什么?
问题描述
我有一个简单的快递应用程序。但我想在某些事件上重新加载中间件。这是运行良好的代码(中间件现在使用新配置),但我想知道这是否是正确的方法:
var express = require('express');
var myMiddleware = require('./myMiddleware.js');
var app = express();
app.use(myMiddleware({ option1: '1', option2: '2' }));
app.listen(3000);
.
.
.
// then on some event I call it again with other options
app.use(myMiddleware({ option1: '100', option2: '200' }));
解决方案
没有支持 Express API 来卸载以前安装的中间件功能,因此您可以重新安装它。
为此,您必须破解 Express 才能从其内部路由阵列中删除该中间件。
另一种实现是代理中间件,这样您就可以控制实际调用的内容。
// initial value of middleware
let currentMiddleware = myMiddleware{ option1: '1', option2: '2' });
// my middleware proxy
app.use(function(req, res, next) {
// call currently indicated middleware function
currentMiddleware(req, res, next);
});
然后,关于未来的一些事件:
// change middleware that is called via currentMiddleware
// this new middleware will be used on all future requests
currentMiddlware = myMiddleware({ option1: '100', option2: '200' });
请记住,对于来自所有用户的所有未来请求,这是服务器上的全局更改。因此,为所有用户更改实时服务器的配置是一件非常不寻常的事情。
如果你真的只是想要一个改变来影响来自一个用户的未来请求,那么这将需要一个完全不同的实现。您仍然可以使用上面提到的代理设计,但您将使用分支逻辑来决定(可能基于用户会话变量中的某些状态)为每个给定请求执行哪个中间件。
推荐阅读
- android - FLAG_ACTIVITY_NEW_TASK:文档中的警告?
- ruby-on-rails - 如何在 Rails 的 wicked_pdf 中有一个动态标题?
- php - CodeIgniter 多数据库连接未从第二个数据库获取数据
- templates - 我想知道这些作业模板以哪种格式存储以及它在服务器中的位置?
- excel - 在工作表之间查找并选择单元格内容
- pdfbox - PDFBox 的内存泄漏问题
- javascript - 通过html传递对象变量
- angular - 如何访问 *ngIf 指令中使用的角度材料组件的值?
- matlab - 如何在不实例化的情况下从 matlab 函数中调用 matlab 类方法
- user-interface - 原子的这个主题是什么?