繁体   English   中英

保存用户对象时解析服务器/ JS SDK,错误206

[英]Parse Server / JS SDK, error 206 when saving a user object

我在使用Parse Server JS SDK编辑和保存用户时遇到了麻烦。

我正在登录,登录并检索用户就可以了,我可以无例外地调用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' }

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

将Parse Server与来自现有应用程序的已迁移数据一起使用时,我遇到了完全相同的问题。

该应用是在2015年3月引入新的增强型会话之前创建的。 该应用程序仍在使用旧的会话令牌,并且从未迁移到新的可撤消会话系统。 Parse Server需要可撤消的会话令牌,并且在遇到旧式会话令牌时将失败。

在“应用程序设置”面板中,迁移之前没有启用“ Require revocable sessions设置,并且在切换到Parse Server时,用户会话未迁移到新系统。 尝试编辑用户的结果是带有消息的400 Bad Requestcannot modify user xxxxx (Code: 206)

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

您还应该检查在迁移过程中是否正确处理了无效的会话令牌错误 ,以提示用户再次登录并因此获得新的会话令牌。

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会话令牌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中的工作方式。 createUser返回时,尚未创建用户。 调用user.save会启动保存过程,但是直到执行成功或错误回调后它才结束。 您应该让createUser将另一个回调作为参数,然后从user.save成功回调中调用它。

另外,您无法使用保存创建用户。 您需要使用Parse.User.signUp.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM