2013-03-08 86 views
3

因此,我在我的用戶架構上實現findOrCreate,基本上只有一組配置文件(每個用戶可以有多個登錄策略)。你可以把它看作一個給定的用戶,通過提供一個匹配的提供者和id的配置文件給我們所稱的findOrCreate提供的配置文件。 findOrCreate的目標是識別與提供的配置文件相匹配的用戶或使用提供的配置文件創建新用戶。這個函數有四個返回的情況。而查詢用戶 node.js + mongoose UserSchema findOrCreate

  • 用戶發現無法找到用戶,並試圖創建後發生
  • 錯誤發生

    1. 誤區一
    2. 無法找到用戶,併成功創建了一個

    現在,我相信下面的代碼可以做到這一點。我對這個問題的擔憂和原因是提供給findOne的回調並不一致地返回。如果在查詢用戶時發生錯誤,我們將返回回調(...),如果我們找到用戶,則返回回調(...),但是,如果我們需要創建用戶,我們永遠不會顯式返回。有沒有辦法可以返回保存的結果?那就是我應該做的事情,還是這樣糾正我的方式?

    代碼:

    UserSchema.static('findOrCreate', function (profile, callback) { 
        this.findOne({ profiles: { $elemMatch: { provider: profile.provider, id: profile.id }}}, function(err, user) { 
         if (err) 
          return callback(err); 
    
         if (user) 
          return callback(null, user); 
    
         user = new User({ 
          profiles: [profile] 
         }); 
         user.save(function (err, user) { 
          if (err) 
           return callback(err); 
    
          return callback(null, user); 
         }); 
        }); 
    }); 
    
  • +1

    此代碼看起來不錯。雖然彼得想清理它的想法是一個很好的想法,但你在這裏所擁有的應該仍然有效。 – JohnnyHK 2013-03-08 13:34:32

    回答

    1

    只是做user.save(callback);因爲你的內聯匿名函數有什麼save已經與它的回調確實基本上是相同的。 return語句純粹是流程控制機制,其唯一目的是爲了避免在該函數中執行後續代碼,並且實際返回值本身完全被調用方忽略,正如節點中的異步編程中慣用的那樣。您可以使用if/else塊而不是if/return保護子句編碼相同的邏輯,並且根本不會使用return關鍵字,並且仍然可以使此功能正常工作。