2016-03-10 51 views
0

在客戶端:您如何知道何時進行簡歷登錄嘗試或完成?

  1. 你能告訴頁面加載簡歷登錄嘗試是否會進行?
  2. 試圖返回時是否存在鉤子?我可以聽正確的DDP消息嗎?

編輯:看起來像Meteor.userId()是在頁面加載時定義的,當將進行恢復登錄嘗試時,將處理#1。

+0

也許'Accounts.validateLoginAttempt(函數(attemptInfo){...})'可能是有用的。這必須放在服務器中。函數內部可以使用'if(attemptInfo.type =='resume'){...}'。有關更多詳細信息,請參閱[文檔](http://docs.meteor.com/#/full/accounts_validateloginattempt) –

+0

謝謝!我會編輯以澄清我關心的是客戶端鉤子。 – Loren

+0

你爲什麼需要這個?你能解釋你的用例嗎? – Mitar

回答

0

這裏有幾個解決方案:

觀看DDP客戶端

不幸被流處理器調用的登錄方法的結果的時候,Meteor.connection._methodInvokers已被清除 - 因此搜索功能。如果知道resumeMethodId有不同/更有效的方法,那將會很好。幾種可能性:

  • 它是否保證有編號"1"
  • 流星決定調用登錄時調用的鉤子
  • 如果Meteor.connection._methodInvokers被動,我可以在找到id後停止自動運行。

resumeAttemptComplete = (success) -> 
    console.log 'resumeAttemptComplete', success 

resumeMethodId = null 

searchForResumeMethodId = -> 
    for id, invoker of Meteor.connection._methodInvokers 
    sentMessage = invoker._message 
    if sentMessage.method is 'login' and sentMessage.params[0].resume? 
     resumeMethodId = id 

if Meteor.isClient 
    Meteor.connection._stream.on 'message', (messageString) -> 
    unless resumeMethodId 
     searchForResumeMethodId() 

    message = JSON.parse messageString 

    if message.id is resumeMethodId and message.msg is 'result' 
     resumeAttemptComplete !message.error 

_methodInvokers定義:https://github.com/meteor/meteor/blob/de74f2707ef34d1b9361784ecb4aa57803d34ae8/packages/ddp-client/livedata_connection.js#L79-L83

服務器onLogin發送事件給客戶

// server: 

// map of connection ids -> publish function contexts 
let onResumePublishers = {} 

Meteor.publish('onResume', function() { 
    onResumePublishers[this.connection.id] = this 

    this.ready() 

    this.onStop(() => { 
    delete onResumePublishers[this.connection.id] 
    }) 
}) 

let handleLoginEvent = function({connection, type}, loggedIn) { 
    if (type === 'resume') { 
    let publisher = onResumePublishers[connection.id] 
    if (publisher) 
     publisher.added('onResume', connection.id, {loggedIn}}) 
    } 
} 

Accounts.onLogin(function (loginAttempt) { 
    handleLoginEvent(loginAttempt, true) 
}) 

Accounts.onLoginFailure(function (loginAttempt) { 
    handleLoginEvent(loginAttempt, false) 
}) 

// client: 

let resumeExpires = new Date(localStorage.getItem('Meteor.loginTokenExpires')) 
let resumeAttemptBeingMade = resumeExpires && resumeExpires > new Date() 

let OnResume = new Mongo.Collection('onResume') 

let onResumeSubscription = Meteor.subscribe('onResume') 

OnResume.find(Meteor.connection.id).observeChanges(
    added(id, {loggedIn}) { 
    onResumeSubscription.stop() 
    onResumeAttemptCompleted(loggedIn) 
    } 
}) 

let onResumeAttemptCompleted = function(success) { 
    // ... 
} 
0

檢查Meteor.loggingIn()。如果您想知道用戶是否正在嘗試登錄。 docs

+0

在恢復登錄期間,'loggingIn()'永遠不會成立,並且'onLogin'不會在客戶端上被調用。 – Loren

+0

你想要做什麼?失敗是指用錯誤的密碼進行登錄嘗試? – Areca

+0

主要關注簡歷案例 - 如果令牌登錄成功,我想在連接上設置一個字段。如果失敗,我想調用某種方法。 – Loren