Parse Server / JS SDK,保存用户对象时报错206
Parse Server / JS SDK, error 206 when saving a user object
我在使用 Parse Server JS SDK 编辑和保存用户时遇到问题。
我正在登录,登录并检索用户就好了,我可以毫无例外地调用 user.set
和 add/edit 我想要的任何字段,但是当我尝试保存时,即使使用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 Request
,消息为 cannot modify user xxxxx (Code: 206)
。
为了解决这个问题,我遵循了 Parse 提供的 Session Migration Tutorial,它解释了如何从遗留会话令牌升级到可撤销会话。根据您的需要描述了多种方法,例如 enableRevocableSession()
在移动应用程序上启用这些会话,如果您只有一个网络应用程序,您可以强制执行任何 API 带有旧会话令牌的请求return 一个 invalid session token
错误等
您还应该检查在迁移过程中您是否 handling invalid session token error 正确提示用户再次登录并因此获得新的会话令牌。
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
成功了。
这不是异步函数在 JavaScript 中的工作方式。当createUser
returns时,用户尚未创建。调用 user.save 启动保存过程,但直到执行成功或错误回调后才完成。您应该 createUser
将另一个回调作为参数,并从 user.save 成功回调中调用它。
此外,您无法通过保存创建用户。您需要使用 Parse.User.signUp.
函数returns调用成功或错误前很久
我遇到了同样的错误,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}}
我还看到一堆用户为 "undefined" 的 beforeSave 和 afterSave 日志。不确定这是否相关。
beforeSave triggered for _User for user undefined:
我是 运行 Heroku 上的最新解析器服务器版本 2.2.18(在 AWS 上试过,结果相同)
我在使用 Parse Server JS SDK 编辑和保存用户时遇到问题。
我正在登录,登录并检索用户就好了,我可以毫无例外地调用 user.set
和 add/edit 我想要的任何字段,但是当我尝试保存时,即使使用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 Request
,消息为 cannot modify user xxxxx (Code: 206)
。
为了解决这个问题,我遵循了 Parse 提供的 Session Migration Tutorial,它解释了如何从遗留会话令牌升级到可撤销会话。根据您的需要描述了多种方法,例如 enableRevocableSession()
在移动应用程序上启用这些会话,如果您只有一个网络应用程序,您可以强制执行任何 API 带有旧会话令牌的请求return 一个 invalid session token
错误等
您还应该检查在迁移过程中您是否 handling invalid session token error 正确提示用户再次登录并因此获得新的会话令牌。
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
成功了。
这不是异步函数在 JavaScript 中的工作方式。当createUser
returns时,用户尚未创建。调用 user.save 启动保存过程,但直到执行成功或错误回调后才完成。您应该 createUser
将另一个回调作为参数,并从 user.save 成功回调中调用它。
此外,您无法通过保存创建用户。您需要使用 Parse.User.signUp.
函数returns调用成功或错误前很久
我遇到了同样的错误,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}}
我还看到一堆用户为 "undefined" 的 beforeSave 和 afterSave 日志。不确定这是否相关。
beforeSave triggered for _User for user undefined:
我是 运行 Heroku 上的最新解析器服务器版本 2.2.18(在 AWS 上试过,结果相同)