2013-01-23 50 views
0

我試圖創建數據,如果在數據庫中存在一個Facebook ID其他創建新的數據,但第一個條件工作正常,但是當它的創建數據什麼也沒有發生,ONy得到connot read property 'provider' of null即使我硬編碼提供者值。mongo原生不創建數據

db.collection('accounts', function(err, collection){ 
    collection.findOne({'email': fbEmail}, function(err, item){ 
     var providerId = item.provider.facebook.id; 
     console.log("facebook id should be: "+providerId); 
     if(providerId == ""){ 
      collection.update({email:fbEmail, 'provider.facebook.id':""}, {$set: {"provider.facebook.id": fbId}}, {safe:true}, function(err){ 
       if(err){ 
        console.log(err); 
       }else{ 
        console.log("id updated!"); 
       }; 
      }); 
     }else{ //creates a new user 
      console.log("creating a new account..."); 
      collection.update({'email': fbEmail}, { 
       'email': fbEmail, 
       'provider': 
        { 
         'facebook': {'id': fbId},        
         'twitter': {'id': ""}         
        }      
      }, {upsert:true}, function(err, doc){ 
       if(err){ 
        console.log("Error finding email "+err); 
       }     
      });    
     } 
    }); 
}); 
+1

在你的'findOne'回調函數中,你需要在檢查'item.provider'之前檢查'item'是否爲'null'。如果這是一個新的電子郵件,'item'將是'null'。 – JohnnyHK

回答

1

一個accounts託收(第一個)具有provider=null。您可以修改findOne條件通過以下方式來避免它:

collection.findOne({'email': fbEmail, 'provider': {$exists: true}}, ... 

注意,這種修改將只跳過所有帳戶而不provider字段集(或設置爲null)。

+0

對不起,如果我沒有完全理解你的筆記,我仍然需要執行第一個'collection.update'時,在提供者的Facebook ID是'空',但如果我跳過所有帳戶沒有'提供者'字段設置,那麼我不知道如何再次執行上述操作。 – nihulus

+0

我想我已經解決了它=)只需在'findOne'之外創建新的電子郵件並使用'{$ exists:true}',正如你所說的,謝謝! – nihulus

+0

我的意圖是在未提供任何提供者的情況下警告您。無論如何,我很高興你解決了這個問題。別客氣! – Vladimir