node js - 会话对象

时间:2017-08-29 15:50:42

标签: javascript node.js express

我在node / express中有一个非常简单的应用程序,一旦用户连接,就会将http运行到另一台服务器,对接收的数据进行一些计算并响应用户。

现在因为服务器到服务器的数据流量和所需的计算是这个流程的瓶颈,我不想为每个连接到我的应用程序的用户重做这个工作。

有没有办法只为第一个用户执行此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));
})

基本上我想保留的是app对象

谢谢,Loris

1 个答案:

答案 0 :(得分:0)

在共享范围内创建变量。

当存在连接时,请测试该变量是否具有值。

如果没有,请为其分配一个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

然后,您有一个承诺负责获取每个连接的数据,并且它将为后续连接缓存它。