2015-06-17 8 views
0

Есть ли способ получить или удалить промежуточное программное обеспечение в 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 Docs «s сказать, что она добавила немного сахара к его промежуточному слою, но никогда явно упоминает никакого сахара, и, в частности, не говоря уже это поведение.

Возможно ли это в express? Если с ванильной версией это невозможно, как трудно было бы реализовать? Я хотел бы избежать изменения самой библиотеки. Кроме того, каковы недостатки для этого, в любой из трех библиотек?

EDIT:

Мой случай использования является то, что я в основном реинжиниринг gulp-webserver, с некоторыми улучшениями, как тот плагин, и все другие подобные ему, находятся в черном списке. gulp - это бегун задачи, который имеет концепцию «файловых объектов», и можно получить доступ к их содержимому и пути, поэтому я в основном хочу, чтобы каждый файл статически ставился, когда пользователь переходит к соответствующему URL-адресу в браузере. Проблема в том, что я должен убедиться, что пользователь получает новый файл, а не старую версию. Если я просто добавлю app.use каждый раз, сервер увидит файл, поскольку он изначально, и никогда не попадает в промежуточное ПО с новой версией.

Я не хочу перезапускать сервер при каждом изменении файла, хотя я буду, если не найду лучшего способа, поэтому мне кажется, что мне нужно либо модифицировать исходное промежуточное ПО на лету (не очень хорошая идея) , удалите его или добавьте его в начало, а не в конец. В любом случае, я сначала должен знать, где он «живет».

ответ

1

Возможно, вы найдёте то, что ищете в server1._router.stack, но неясно, что именно вы пытаетесь сделать (что вы подразумеваете под «доступом»?).
В любом случае, это не очень хорошая идея, но это зависит от реализации, а не от спецификации/API. В результате все предположения, касающиеся внутренней реализации библиотеки, в конечном итоге должны сломаться. В конце концов вам придется либо переписать свой код (и «переработать» библиотеку еще раз), либо заблокировать себя для конкретной версии библиотеки, которая приведет к устаревшему коду с потенциальными ошибками и уязвимостями, а также никаких новых функций/улучшений.

+0

Я добавил кейс для использования. По общему признанию, это сложный прецедент, поэтому я не могу делать то, что хочу. Мне не нужно менять какое-либо промежуточное ПО, хотя это тоже может работать; Мне действительно нужно удалить или удалить его. – trysis