2016-07-25 41 views
4

我在使用Parse Server JS SDK編輯和保存用戶時遇到問題。保存用戶對象時解析服務器/ JS SDK,錯誤206

我登錄,登錄和檢索用戶就好了,我可以毫不例外user.set調用,並添加/編輯我想要的任何領域,但是當我試圖保存,使用masterKey即使,我得到Error 206: Can t modify user <id>

我也嘗試使用save來直接設置字段,結果相同。

一個有趣的事情是,在數據庫中,用戶的模式會更新新的字段和類型。

這裏是我的更新功能:

function login(user, callback) { 
    let username = user.email, 
     password = user.password; 

    Parse.User.logIn(username, password).then(
     (user) => { 
      if(!user) { 
       callback('No user found'); 
      } else { 
       callback(null, user); 
      } 
     }, 
     (error) => { 
      callback(error.message, null); 
     } 
    ); 
} 

function update(user, callback) { 
    login(user, (error, user) => { 
     if(error) { 
      callback('Can t find user'); 
     } else { 
      console.log('save'); 
      console.log('Session token: ' + user.getSessionToken()); 
      console.log('Master key: ' + Parse.masterKey); 
      user.set('user', 'set'); 
      user.save({key: 'test'}, {useMasterKey: true}).then(
       (test) => { 
        console.log('OK - ' + test); 
        callback(); 
       }, (err) => { 
        console.log('ERR - ' + require('util').inspect(err)); 
        callback(error.message); 
       } 
      ); 
     } 
    }); 
} 

和錯誤的爲例:

update 
save 
Session token: r:c29b35a48d144f146838638f6cbed091 
Master key: <my master key> 
ERR- ParseError { code: 206, message: 'cannot modify user NPubttVAYv' } 

我如何保存我的正確用戶編輯?

+0

https://github.com/ParsePlatform/parse-server/issues/1729#issuecomment-218778755 – eggyal

回答

1
function login(logInfo, callback) { 
    let username = logInfo.email, 
     password = logInfo.password; 

    Parse.User.logIn(username, password).then(
     (user) => { 
      if(!user) { 
       callback('No user found'); 
      } else { 
       callback(null, user); 
      } 
     }, 
     (error) => { 
      callback(error.message, null); 
     } 
    ); 
} 

function update(userInfo, data, callback) { 
    login(userInfo, (error, user) => { 
     if(error) { 
      callback('Can t find user'); 
     } else { 
      getUpdatedData(user.get('data'), data, (error, updateData) => { 
       if(error) { 
        callback(error); 
       } else { 
        user.save({data: updateData}, /*{useMasterKey: true}*/ {sessionToken: user.get("sessionToken")}).then(
         (test) => { 
          callback(); 
         }, (err) => { 
          callback(error.message); 
         } 
        ); 
       } 
      }); 
     } 
    }); 
} 

由於某些原因,重試使用sessionToken工作。

2

當使用Parse Server從現有應用程序遷移數據時,我遇到了完全相同的問題。

該應用程序是在2015年3月之前創建新的增強型會話時創建的。該應用程序仍在使用傳統會話令牌,並且從未製作遷移到新的可撤銷會話系統。解析服務器需要可撤銷會話令牌,並在遇到舊會話令牌時失敗。

在應用程序設置面板中,在切換到分析服務器時,在遷移和用戶會話未遷移到新系統之前,未啓用Require revocable sessions設置。嘗試編輯用戶時的結果爲400 Bad Request,消息爲cannot modify user xxxxx (Code: 206)

要解決此問題,我遵循Parse提供的Session Migration Tutorial,該解釋說明如何從舊會話標記升級到可撤銷會話。根據您的需求描述多種方法,如enableRevocableSession()在移動應用上啓用這些會話,如果您只有一個Web應用,則可以強制執行任何具有舊會話令牌的API請求以返回invalid session token錯誤等。

您還應該在遷移過程中正確檢查您是否爲handling invalid session token error以提示用戶再次登錄並因此獲得新的會話令牌。

+0

我從頭開始構建應用程序,它不是一個遷移。 – DrakaSAN

-1

這不是異步函數在JavaScript中的工作方式。當createUser返回時,用戶尚未創建。調用user.save會啓動保存過程,但是直到執行成功或錯誤回調纔會結束。您應該有createUser將另一個回調作爲參數,並從user.save成功回調中調用它。

此外,您不能使用保存創建用戶。您需要使用Parse.User.signUp.

該函數在成功或錯誤被調用之前返回很長時間。

+0

此時,用戶已經創建,並確保存在於數據庫中。你在哪裏看到我的代碼中有'createUser'? – DrakaSAN

1

我有同樣的錯誤,既沒有useMasterKey也沒有sessionToken爲我工作。 :( 這裏是我的代碼:

 console.log("### attempt 1 sessionToken: " + request.user.getSessionToken()); 
     var p1 = plan.save(); 
     var p2 = request.user.save(null, {sessionToken: request.user.getSessionToken()}); 
     return Parse.Promise.when([p1, p2]).then(function(savedPlan) { 
     ... 
     } 

我看到日誌輸出匹配的會話令牌: 2016-08-21T00:19:03.318662+00:00 app[web.1]: ### attempt 1 sessionToken: r:506deaeecf8a0299c9a4678ccac47126

我的用戶對象具有正確的ACL值:

"ACL":{"*":{"read":true},"PC7AuAVDLY":{"read":true,"write":true}}

我也看到一堆beforeSave和afterSave日誌,用戶爲「未定義」,不確定是否與之相關。

beforeSave triggered for _User for user undefined:

我在Heroku上運行最新的解析器,服務器版本2.2.18(試圖在AWS和結果都是一樣的)

+0

您是否找到解決方案? –

相關問題