parsing服务器/ JS SDK,保存用户对象时发生错误206

我无法使用Parse Server JS SDK来编辑和保存用户。

我login,login和检索用户就好了,我可以无例外地调用user.set并添加/编辑任何我想要的字段,但是当我尝试保存,即使使用masterKey时,我得到Error 206: Can t modify user <id>

我也尝试使用save来直接设置字段,结果相同。

一个有趣的事情是,在数据库中,用户的架构得到更新与新的领域和types。

这是我的更新function:

 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' } 

如何正确保存我编辑的用户?

在使用Parse Server和现有应用程序的迁移数据时,我遇到了同样的问题。

该应用程序是在2015年3月之前新的增强型会话推出时创build的。 该应用程序仍在使用遗留会话标记,并且从未迁移到新的可撤销会话系统。 parsing服务器需要可撤销的会话令牌,遇到旧会话令牌时会失败。

在“应用程序设置”面板中,迁移之前未启用“ Require revocable sessions设置,切换到“分析服务器”时用户会话未迁移到新系统。 尝试编辑用户时的结果是400 Bad Request ,消息cannot modify user xxxxx (Code: 206)

为了解决这个问题,我遵循了Parse提供的会话迁移教程 ,它解释了如何从旧会话令牌升级到可撤销会话。 根据您的需求描述多种方法,如enableRevocableSession()在移动应用程序上启用这些会话,如果您只有一个Web应用程序,则可以强制执行任何具有旧会话令牌的API请求以返回invalid session token错误等等

您还应该检查在迁移过程中是否正确处理无效的会话标记错误 ,以提示用户再次login,从而获得新的会话标记。

 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工作。

我有同样的错误,既不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上尝试过,结果相同)

这不是JavaScript中asynchronous函数的工作原理。 当createUser返回时,用户还没有被创build。 调用user.save启动保存进程,但是直到执行成功或错误callback才会结束。 你应该有createUser另一个callback作为参数,并从user.save成功callback调用它。

另外,您不能使用保存创build用户。 你需要使用Parse.User.signUp.

该函数在成功或错误被调用之前返回很久。