2017-03-15 101 views
0

我使用onConnection鉤子和一些模板助手來做一些統計的東西。但是現在,當我是註冊用戶時,我不想排除這些操作。 問題,我不能在onConnection鉤子中使用Meteor.user(),所以我如何檢查用戶是否登錄?流星:onConnection,檢查用戶是否登錄

關於代碼,沒有太多展示

Meteor.onConnection(function(conn) { 
if(Meteor.user()) { 
    console.log("you are logged in") 
} else { 
    console.log("u are not logged in") 
} 
}); 

這不是真實的例子,但它顯示了簡單的就是我想要做的 的錯誤

err [Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.] 

我明白,我可以在方法中使用Meteor.user(),但如何在onConnection中找到用戶是否登錄?

+0

發佈訂閱API顯示你已經嘗試了代碼,請。 – zim

+0

@zim添加了一個示例 – equalsound

+0

您是否嘗試使用this.userId,如錯誤消息中所示? – zim

回答

0

顯然如您所述,流星文檔沒有提供任何有關如何實現這一目標的見解。我花了相當長的時間通過accounts-base來源,並沒有看到任何方式來做你本來要求的。

即便如此,如果您每次登錄並保存其當前IP地址時都可以更新Users集合,那麼您可以使用它來查看當前連接是否已登錄。以下是一個示例。

Meteor.onConnection((connection) => { 
    var user = Meteor.users.findOne({ 
    'user.profile.currentIp': connection.clientAddress 
    }); 

    if (user) { 
    console.log("you are logged in") 
    } else { 
    console.log("u are not logged in") 
    } 
}); 

務必添加登錄和註銷掛鉤來設置和刪除用戶的當前IP。我沒有測試過這種方法,但理論上它應該起作用。

+0

是否有可能在客戶端使用onConnection? – Ruben

+0

不可以,只能在服務器上使用 – jordanwillis

+1

@Ruben有一個'Meteor.connection'對象,你可以在客戶端訪問...也許它裏面有類似的方法嗎?我之前使用它來向控制檯打印所有DDP傳入/傳出消息。 – jordanwillis

0

出於統計目的,我建議使用出版物。他們有更復雜的API,可以讓你更好地控制連接。

Meteor.publish('users.trackPresence', function() { 
    // Both this.userId && this.connection are available to be called from here 

    self.onStop(function(){ 
    // user went offline 
    }); 

    this.ready(); 
}); 

和客戶端,你可以檢查用戶是否存在,且即使不認購,如果是這種情況的:當您從Tracker.autorun內訂閱

Tracker.autorun(function(){ 
    if (!Meteor.userId()) 
    Meteor.subscribe('users.trackPresence'); 
}); 

流星自動處理取消/重新訂閱

此處詳細瞭解 https://docs.meteor.com/api/pubsub.html