在客戶端:您如何知道何時進行簡歷登錄嘗試或完成?
- 你能告訴頁面加載簡歷登錄嘗試是否會進行?
- 試圖返回時是否存在鉤子?我可以聽正確的DDP消息嗎?
編輯:看起來像Meteor.userId()
是在頁面加載時定義的,當將進行恢復登錄嘗試時,將處理#1。
在客戶端:您如何知道何時進行簡歷登錄嘗試或完成?
編輯:看起來像Meteor.userId()
是在頁面加載時定義的,當將進行恢復登錄嘗試時,將處理#1。
這裏有幾個解決方案:
不幸被流處理器調用的登錄方法的結果的時候,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
// 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) {
// ...
}
也許'Accounts.validateLoginAttempt(函數(attemptInfo){...})'可能是有用的。這必須放在服務器中。函數內部可以使用'if(attemptInfo.type =='resume'){...}'。有關更多詳細信息,請參閱[文檔](http://docs.meteor.com/#/full/accounts_validateloginattempt) –
謝謝!我會編輯以澄清我關心的是客戶端鉤子。 – Loren
你爲什麼需要這個?你能解釋你的用例嗎? – Mitar