如this post所述,当客户端首次与服务器连接时,将创建“主套接字/进程”并保留其分配。稍后,当客户加入特定的频道/主题时,每个频道的套接字/进程都会复制这些分配,并可以将其添加到它们中。
我现在有一个用例,当用户加入他们自己的单独频道(i.e. user:#{user_id})
时,我从数据库中检索了有关该用户的一些信息,然后该信息将在该用户以后加入的所有频道中全局可用。但是,我一直无法找到一种方法将这些信息放入socket.assigns
中,以便可以在任何地方使用。如果我尝试分配它们,它们将仅在此特定socket.assigns
频道的user:#{user_id}
中可用。
有办法吗?相反,我应该只是尝试在用户首次连接时一次获取所有这些信息,而不是在他们加入单个用户通道时一次获取这些信息吗?
答案 0 :(得分:1)
不同的通道意味着不同的插槽。
最简单的解决方案是保持永久状态('use strict';
const unirest = require('unirest');
var getNutritionInfo = {
mkString: function (foodStr) {
var ingredients = new Array();
ingredients.push(foodStr);
console.log(foodStr)
params = {
ingr: ingredients,
};
esc = encodeURIComponent;
query = Object.keys(params)
.map(k => esc(k) + '=' + esc(params[k]))
.join('&');
foodQuery = query.replace(/%20/g, "+");
return (foodQuery);
},
analyse: function (foodStr) {
url = "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data"
searchQuery = getNutritionInfo.mkString(foodStr);
function requestData(callback) {
unirest.get(url + "?" + searchQuery)
.header("X-RapidAPI-Key", "c5c219c7b0mshbf5b602f68caddep1cd8cfjsn01a1be1f45a4")
.end(function (result) {
let cals = result.body.totalNutrients.ENERC_KCAL.quantity;
console.log(cals + " first");
callback(cals); // pass value here
});
}
requestData(function (cals) { // get value after completion
console.log(cals + " second");
getNutritionInfo.getData();
});
},
getData: function () {
var calories = getNutritionInfo.analyse.cals;
console.log(calories + " third");
return calories;
}
};
,Agent
,ETS
,DETS
,...),并持有地图{{1} },并在需要此信息时查询该状态。