Parse Server / JS SDK, ошибка 206 при сохранении объекта пользователя
У меня проблемы с использованием Parse Server JS SDK для редактирования и сохранения пользователя.
Я вхожу, входя в систему и извлекая пользователя просто отлично, я могу позвонить без исключения user.set
и добавить / изменить любое поле, которое я хочу, но когда я пытаюсь сохранить, даже при использовании masterKey, я получаю Error 206: Can t modify user <id>
,
Я также пытался использовать сохранить, чтобы напрямую установить поля, тот же результат.
Интересно, что в БД Схема пользователя обновляется новыми полями и типами.
Вот моя функция обновления:
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' }
Как правильно сохранить отредактированного пользователя?
4 ответа
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
работал.
У меня была точно такая же проблема при использовании Parse Server с перенесенными данными из существующего приложения.
Приложение было создано до марта 2015 года, когда были представлены новые расширенные сеансы. В приложении все еще использовались устаревшие токены сеансов, и переход на новую систему сеансов отзыва никогда не осуществлялся. Для Parse Server требуются отзывные токены сеансов, и он не будет работать при обнаружении устаревших токенов сеансов.
На панели настроек приложения Require revocable sessions
Этот параметр не был включен до перехода, и пользовательские сеансы не были перенесены в новую систему при переключении на Parse Server. Результат при попытке редактировать пользователя был 400 Bad Request
с сообщением cannot modify user xxxxx (Code: 206)
,
Чтобы устранить эту проблему, я следовал учебному пособию по миграции сеансов, предоставленному Parse, в котором объясняется, как перейти с устаревших токенов сеансов на отзывные сеансы. Несколько методов описаны в зависимости от ваших потребностей, таких как enableRevocableSession()
чтобы включить эти сеансы в мобильном приложении, если у вас есть только веб-приложение, вы можете принудительно заставить любой API-запрос с устаревшим токеном сеанса возвращать invalid session token
ошибка и т. д.
Также следует проверить, правильно ли вы обрабатываете ошибку недопустимого токена сеанса во время миграции, чтобы предложить пользователю снова войти в систему и, следовательно, получить новый токен сеанса.
У меня была та же ошибка, и ни 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, где пользователь "undefined". не уверен, связано ли это.
beforeSave triggered for _User for user undefined:
Я использую последнюю версию сервера синтаксического анализа 2.2.18 на Heroku (пробовал на AWS и результаты такие же)
Это не то, как асинхронные функции работают в JavaScript. когда createUser
возвращается, пользователь еще не был создан. Вызов user.save запускает процесс сохранения, но он не завершается до тех пор, пока не будет выполнен обратный вызов об успешном выполнении или об ошибке. У тебя должно быть createUser
возьмите другой обратный вызов в качестве аргумента и вызовите его из обратного вызова user.save success.
Кроме того, вы не можете создать пользователя с сохранением. Вам нужно использовать Parse.User.signUp.
Функция возвращается задолго до того, как будет вызван успех или ошибка.