2017-08-29 133 views
0

我在node/express中有一個非常簡單的應用程序,一旦用戶連接,運行一個http到另一個服務器,對收到的數據做一些計算並響應用戶。節點js - 會話對象

現在因爲服務器到服務器的數據流和所需的計算是這個流程的瓶頸,我不想爲連接到我的應用的每個用戶重做這個工作。

有什麼辦法可以做到這一點的http請求和它的連續計算只爲第一個用戶,然後重新使用它爲每個後續用戶?

一些代碼

var app = null; 
router.get('/ask', function(req, res, next) { 
... 
dbService.select('apps',appId).then(function(data,err, header){ 
    app = data.rows[0].doc;  

    app.a1.forEach(function(item, index){ 
     app.a1[index]['nameSpellchecker'] = new natural.Spellcheck(item.synonyms); 
    }); 

    app.a1.forEach(function(item, index){ 
     app.a2[index]['nameSpellchecker'] = new natural.Spellcheck(item.synonyms); 
    }); 

    ... 
    res.status(200).send(JSON.stringify(response)); 
}) 

基本上我想保留什麼是應用對象

感謝,洛里斯

+1

你能分享你的代碼嗎? – ninesalt

+1

另外,您嘗試定位多少個併發用戶?用戶等待的是什麼類型的計算是時間敏感信息,例如讓4個併發用戶連接到你的服務器。假設隊列位於user1,user2,user3,user4,則計算將僅發生在user1上,並且計算結果將在user2,user3,user4之間共享。不會給其他用戶陳舊的數據? – Raj

+0

讓我們的信息不是時間敏感的,我會在以後解決......我發現在這裏很有意思https://stackoverflow.com/questions/19925857/global-scope-for-every-request-in-nodejs-express我想分享請求之間的對象,而不是模塊......謝謝你們! – user2428183

回答

0

在共享範圍創建一個變量。

當有連接時,測試以查看該變量是否有值。

如果不是,則爲其分配一個Promise,該Promise將用您想要的數據進行解析。

然後添加一個then處理程序以從中獲取數據並執行所需操作。

var processed_data; 
 

 
function get_processed_data() { 
 
    if (processed_data) { 
 
    return; // Already trying to get it 
 
    } 
 

 
    processed_data = new Promise(function(resolve, reject) { 
 
    // Replace this with the code to get the data and process it 
 
    setTimeout(function() { 
 
     resolve("This is the data"); 
 
    }, 1000); 
 
    }); 
 

 
} 
 

 
function on_connection() { 
 
    get_processed_data(); 
 

 
    processed_data.then(function(data) { 
 
    // Do stuff with data 
 
    console.log(data); 
 
    }); 
 
} 
 

 
on_connection(); 
 
on_connection(); 
 
on_connection(); 
 
setTimeout(on_connection, 3000); // A late connection to show it still works even if the promise has resolved already

你就必須負責獲取數據爲每個連接單獨的承諾,它會緩存它的後續連接。