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.

Другие вопросы по тегам