有没有办法访问或删除您在同一个实例上定义的connect
或express
中的中间件?我注意到在koa
下您可以执行此操作,但我们暂时不会使用koa
,因为它是如此新,所以我在express
尝试做同样的事情。我还注意到connect
有可能输出更复杂,但connect
没有我想要的所有功能,即使是中间件也是如此。
var express = require('express');
var connect = require('connect');
var koa = require('koa');
var server1 = express();
var server2 = connect();
var server3 = koa();
server1.use(function express(req, res, next) {
console.log('Hello from express!');
});
server2.use(function connect(req, res, next) {
console.log('Hello from connect!');
});
server3.use(function* koa(next) {
console.log('Hello from koa!');
});
console.log(server1.middleware);
// logs 'undefined'
console.log(server2.middleware);
// logs 'undefined'
console.log(server2.stack);
logs [ { route: '', handle: [Function: connect] } ]
console.log(server3.middleware);
// logs [ [Function: koa] ]
koa
的医生说它在中间件中添加了一些糖,但从未明确提到任何糖,特别是没有提到这种行为。
这可能在express
吗?如果香草版本无法实现,那么实施起来有多难?我想避免修改库本身。另外,在3个库中的任何一个库中,这样做的缺点是什么?
修改:
我的用例是我基本上重新设计了gulp-webserver
,并进行了一些改进,因为该插件以及所有其他类似插件被列入黑名单。 gulp
是一个任务运行器,它具有"文件对象"的概念,并且可以访问它们的内容和路径,因此我基本上希望在用户访问时静态地为每个文件提供服务浏览器中的相应URL。麻烦在于观察,因为我需要确保用户获取新文件,而不是旧版本。如果我每次只添加一个app.use
,服务器将会看到原来的文件,并且永远不会使用新版本访问中间件。
我不想在每次文件更改时重新启动服务器,但是如果我找不到更好的方法,我会这样做,所以我似乎需要动态修改原始中间件(不是一个好主意) ),删除它,或将其添加到开头而不是结尾。无论哪种方式,我首先需要知道它在哪里生活"。
答案 0 :(得分:1)
您可能会在server1._router.stack
中找到您要查找的内容,但目前尚不清楚您究竟要做什么(您的意思是“访问”是什么意思?)。
在任何情况下,做任何这些都不是一个好主意,因为这完全依赖于实现,而不是规范/ API。因此,关于库的内部实现的任何和所有假设最终都会被破坏。您最终将不得不重写您的代码(并再次对该库进行“反向工程”),或者将自己锁定到特定的库版本,这将导致过时的代码,潜在的错误和漏洞,并且没有新的功能/改进。