ExpressJS + jsdom - Scope Issue
У меня есть веб-приложение expressJS с настроенными маршрутами. У меня также есть несколько функций, которые существуют в среде jsdom из-за различных функций jquery, которыми я хочу воспользоваться.
Проблема в том, что мне нужно вызывать функцию из jsdom на уровне области действия expressJS.
Я действительно надеюсь, что это каким-то образом возможно, так как это значительно упростит мою жизнь.
Например:
// express
app.get('/someRoute', function(request, response){
myFunction( request.data, function( getResponse ){
response.status( 200 ).send( getResponse );
}
})
//jsdom
jsdom.env('html', function(err, window) {
.....
myFunction( a, callback ){
// <some jquery-only feature that I need>
callback(a);
}
})
1 ответ
Да, вы можете, у вас есть несколько вариантов. Я полагаю, что эти две части будут в разных файлах, в противном случае вы можете просто определить переменную в верхней части файла и назначить ее внутри jsdom
, В зависимости от того, насколько велико ваше приложение, вы можете выбрать одно или другое:
Быстрая, но не самая лучшая: внутри jsdom.env
function, определите глобальную функцию, которая будет доступна с маршрутизатора ExpressJS.
// express
app.get('/someRoute', function(request, response){
global.myJSDomFunction(request.data, function( getResponse ){
response.status( 200 ).send( getResponse );
}
})
//jsdom
jsdom.env('html', function(err, window) {
.....
global.myJSDomFunction = myFunction( a, callback ){
// <some jquery-only feature that I need>
callback(a);
}
})
Хорошо, определение глобальных переменных обычно не рекомендуется, чтобы поддерживать разумную архитектуру и не генерировать коллизии имен. Давайте попробуем определить третий файл, в который вы можете прикрепить свою функцию:
// express
const fnContainer = require('../fnContainer')
app.get('/someRoute', function(request, response){
fnContainer.myJSDomFunction(request.data, function( getResponse ){
response.status( 200 ).send( getResponse );
}
})
//jsdom
const fnContainer = require('../fnContainer')
jsdom.env('html', function(err, window) {
.....
fnContainer.myJSDomFunction = myFunction( a, callback ){
// <some jquery-only feature that I need>
callback(a);
}
})
//fnContainer.js
module.exports = {
myJSDomFunction: null,
}
Лучше всего будет улучшить имена в зависимости от вашего случая. У вас могут быть более сложные структуры, в конце урок заключается в том, что вы должны сохранить эту функцию в месте, доступном изнутри маршрута Express.js.