解析新用户保存不return新ID

Parse new User save does not return new ID

在Parse中保存新用户时,虽然用户保存正确,但保存后并没有返回新用户,所以代码在console.log("userResult id " + userResult.id);处出错。如果用户已经存在,保存函数 returns id 正确。这是 Parse 的错误还是我遗漏了什么?

    return userQuery
        .first(function (userResult) {
            if (!helpers.isDefined(userResult)) {
                userResult = new Parse.User();
                userResult.set("username", helpers.phoneToUsername(phoneNumber));
                userResult.set("password", helpers.generatePassword(phoneNumber));
                userResult.set("displayName", displayName);
            }
            userResult.set("location", location);
            userResult.set("smsVerified", false);
            return userResult.save()
        })
        .then(function (userResult) {
            console.log("userResult id " + userResult.id); <-- ERROR HERE
            user = userResult;
            return Verification.createSmsVerification(userResult);
        })...

错误:

Result: TypeError: Cannot read property 'id' of undefined
    var userQuery = new Parse.Query(Parse.User);
        userQuery.equalTo("username", helpers.phoneToUsername(phoneNumber));

好像用户在 then() 回调之后被保存了,但不应该是这样。

尝试return它:

  return userQuery
        .first(function (userResult) {
            if (!helpers.isDefined(userResult)) {
                userResult = new Parse.User();
                userResult.set("username", helpers.phoneToUsername(phoneNumber));
                userResult.set("password", helpers.generatePassword(phoneNumber));
                userResult.set("displayName", displayName);
            }
            userResult.set("location", location);
            userResult.set("smsVerified", false);
            return userResult.save()
        })
        .then(function (userResult) {
            console.log("userResult id " + userResult.id); <-- ERROR HERE
            user = userResult;
            return Verification.createSmsVerification(userResult);
        })...

在黑暗中摸索了一段时间后,我发现问题是初始代码在 first() 回调中,而不是在 thenable 中。将最上面的代码行从 first(function()... 更改为 first().then(function() 已解决问题。

return userQuery.first()
        .then(function (userResult) {
            if (!helpers.isDefined(userResult)) {
                userResult = new Parse.User();
                userResult.set("username", helpers.phoneToUsername(phoneNumber));
                userResult.set("password", helpers.generatePassword(phoneNumber));
                userResult.set("displayName", displayName);
            }
            userResult.set("location", location);
            userResult.set("smsVerified", false);
            return userResult.save()
        })
        .then(function (userResult) {
            console.log("userResult id " + userResult.id); <-- ERROR HERE
            user = userResult;
            return Verification.createSmsVerification(userResult);
        })...