我在server/statusboard.js中有以下代码;
var require = __meteor_bootstrap__.require,
request = require("request")
function getServices(services) {
services = [];
request('http://some-server/vshell/index.php?type=services&mode=json', function (error, response, body) {
var resJSON = JSON.parse(body);
_.each(resJSON, function(data) {
var host = data["host_name"];
var service = data["service_description"];
var hardState = data["last_hard_state"];
var currState = data["current_state"];
services+={host: host, service: service, hardState: hardState, currState: currState};
Services.insert({host: host, service: service, hardState: hardState, currState: currState});
});
});
}
Meteor.startup(function () {
var services = [];
getServices(services);
console.log(services);
});
Run Code Online (Sandbox Code Playgroud)
基本上,它从JSON提要中提取一些数据并尝试将其推送到集合中.
当我启动Meteor时,我得到以下异常;
app/packages/livedata/livedata_server.js:781
throw exception;
^
Error: Meteor …Run Code Online (Sandbox Code Playgroud) 当用户退出网站时,有什么方法可以提取吗?当他们这样做时,我需要做一些清理工作.使用内置的meteor.js用户帐户.
我将使用它进行一些验证,因此我需要一个不能代表客户端的其他用户触发的解决方案 - 最好是完全服务器端的东西.
Express实现了一个服务器端会话对象,允许您存储特定于客户端的数据.你如何在Meteor中做同等效果的?
strack推荐使用一个集合.如果集合中的对象的id是在连接对象上公开服务器端和客户端的session_id,则这将起作用.
客户端和服务器似乎通过客户端上的LivedataConnection共享session_id:
if (typeof (msg.session) === "string") {
var reconnected = (self.last_session_id === msg.session);
self.last_session_id = msg.session;
}
Run Code Online (Sandbox Code Playgroud)
和服务器上的LivedataSession对象:
self.id = Meteor.uuid();
Run Code Online (Sandbox Code Playgroud)
但Meteor API不会公开这些对象.访问会话信息的正确方法是什么?
如果客户端的Session对象与可从Meteor#publish和Meteor#方法访问的客户端唯一的服务器端Session对象同步,那将非常方便.
我正在Meteor中编写一个数据敏感的应用程序,并试图限制客户端访问尽可能多的信息.因此,我想实现服务器端计算登录和匿名用户数量的方法.
我尝试了各种方法.第一个问题是在客户端断开连接后这个问题中的服务器清理,这表明挂钩:
this.session.socket.on("close")
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做,并试图更改集合时,它抛出了"Meteor代码必须始终在光纤内运行"错误.我认为这个问题是因为一旦套接字关闭,光纤就会被杀死,因此无法访问数据库.当在服务器上调用Collection.insert作为可能的解决方案时,OP指出这个"Meteor代码必须始终在光纤内运行",但我不确定这是否是最好的方法,基于对答案的评论.
然后我尝试自动运行变量:
Meteor.default_server.stream_server.all_sockets().length
Run Code Online (Sandbox Code Playgroud)
但是自动运行似乎永远不会被调用,所以我假设变量不是一个反应上下文,我不知道如何使它成为一个.
最后一个想法是做一个keepalive风格的东西,但这似乎完全违背了流星哲学,我想我只会用作绝对的最后手段.
我执行console.log了一些函数this.session.socket,并且唯一可能的其他函数是.on("data"),但是当套接字关闭时不会调用它.
我在这里有点亏,所以任何帮助都会很棒,谢谢.
简单的问题,也许是简单的答案:如何在服务器上知道某个客户端已断开连接?基本用例:服务器需要知道玩家是否已断开连接.