javascript - Parse Server/JS SDK, fel 206 vid sparande av ett användarobjekt


Jag har problem med att använda Parse Server JS SDK för att redigera och spara en användare.

Jag loggar in, loggar in och hämtar användaren utan problem, jag kan anropa utan undantag user.set och lägga till/redigera vilket fält jag vill, men när jag försöker spara, även när jag använder masterKey, får jag Fel 206: Kan inte ändra användaren <id>.

Jag har också försökt använda save för att direkt sätta fälten, samma resultat.

En intressant sak är att i databasen uppdateras användarens schema med de nya fälten och typerna.

Här är min uppdateringsfunktion:

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);
                }
            );
        }
    });
}

Och ett exempel på felet:

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

Hur kan jag spara min redigerade användare korrekt?

Svar #1

Jag hade exakt samma problem när jag använde Parse Server med migrerad data från en befintlig app.

Appen skapades före mars 2015 när de nya Förbättrade sessionerna introducerades. Appen använde fortfarande äldre sessionstoken och migreringen till det nya systemet med återkalleliga sessioner gjordes aldrig. Parse Server kräver återkalleliga sessionstoken och kommer att misslyckas när den stöter på äldre sessionstoken.

I appens inställningspanel var inställningen Require revocable sessions inte aktiverad före migreringen och användarsessioner migrerades inte till det nya systemet när man bytte till Parse Server. Resultatet när man försökte redigera en användare var en 400 Bad Request med meddelandet cannot modify user xxxxx (Code: 206).

För att åtgärda problemet följde jag Session Migration Tutorial som tillhandahålls av Parse, vilket förklarar hur man uppgraderar från gamla sessionstoken till återkalleliga sessioner. Flera metoder beskrivs beroende på dina behov, till exempel enableRevocableSession() för att aktivera dessa sessioner på en mobilapp, om du endast har en webbapp kan du se till att alla API-förfrågningar med ett gammalt sessionstoken returnerar ett invalid session token-fel, osv.

Du bör också kontrollera om du hanterar fel med ogiltig sessionstoken korrekt under migreringen för att uppmana användaren att logga in igen och därigenom få en ny sessionstoken.

Svar #2

Jag hade samma fel och varken useMasterKey eller sessionToken fungerade för mig heller. :( Här är min kod:

        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) {
        ...
        }

Jag ser den matchande sessionstoken i loggutdata: 2016-08-21T00:19:03.318662+00:00 app[web.1]: ### försök 1 sessionToken: r:506deaeecf8a0299c9a4678ccac47126

mitt användarobjekt har de korrekta ACL-värdena:

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

Jag ser också en massa beforeSave- och afterSave-loggar där användaren är "undefined". Vet inte om det är relaterat.

beforeSave triggered for _User for user undefined:

Jag kör senaste parser-server version 2.2.18 på Heroku (testade det på AWS och resultaten är desamma)