2017-08-15 27 views
1

我有一個expressJS web應用程序與路由設置。我還有幾個函數存在於jsdom環境中,因爲我想利用各種jquery函數。ExpressJS + jsdom - 範圍問題

我遇到的問題是我需要在expressJS作用域級別的jsdom中調用一個函數。

我真的希望這是可能的某種方式,因爲這將大大簡化我的生活。

例如:

// 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); 
    } 
}) 

回答

0

是的,你可以,你有幾種選擇。我想這兩個部分將在不同的文件中,否則你可以在文件的頂部定義一個變量,並在jsdom內指定它。根據你的應用程序的大小,你可能想要選擇一個或另一個:

快速但不是很好的:在jsdom.env函數裏面,定義一個全局函數,它可以從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路徑內訪問的位置。