find的结果在我的云函数中是未定义的

The results of Parse.Query.find is undefined in my cloud function

本文关键字:未定义 函数 我的 结果 find      更新时间:2023-09-26

我是一个新手,刚刚开始在我的休闲手机游戏中使用Parse。

我正在写一个云代码,客户端可以请求购买甲板。因为代码对于解释我的问题很重要,所以我把我的问题移到了代码下面。

我有以下类:

    1. User :
        coin(Number)
    2. Deck :
        priceCoin(Number)
        nickname(String)
    3. User_Deck :
        userId(Pointer to User)
        deckId(Pointer to Deck)

类和客户端的数据请求:

  • 用户和甲板类各有一行,用户请求购买甲板。
  • 发送给云函数的参数是deck,是deck的objectId。

这是云函数:

Parse.Cloud.define("req_purchase_deck", function(request, response) {
    var purchaseDeck;
    var deckQuery = new Parse.Query("Deck");
    deckQuery.get( request.params.deck, function(result) {
        purchaseDeck = result; // Q2 : is this valid in the scope of this function?
        var userHasQuery = new Parse.Query("User_Deck");
        userHasQuery.equalTo("userId", request.user);
        userHasQuery.equalTo("deckId", result);
        return userHasQuery.find();
    }).then( function( results ) { // Q1 : Why results undefined?
        if( results == null || results.length == 0 ) {
            var userCoin = request.user.get("coin");
            var priceCoin = purchaseDeck.get("priceCoin");
            if( userCoin >= priceCoin ) {
                console.log("/purchase made/" + userCoin + " - " + priceCoin + " = " + userCoin - priceCoin);
                request.user.set("coin", userCoin - priceCoin);
                return request.user.save();
            }
            else {
                return Parse.Promise.error("not enough coins");
            }
        }
        else {
            return Parse.Promise.error("already has deck");
        }
    }).then( function(result) {
        var newUserDeckObject = new Parse.Object("User_Deck");
        newUserDeckObject.set("userId", request.user);
        newUserDeckObject.set("deckId", purchaseDeck);
        console.log("/purchase deck added");
        return newUserDeckObject.save();
    }).then( function(result) {
        var returns = {};
        returns["userCoins"] = request.user.get("coin");
        returns["purchasedDeck"] = purchaseDeck.get("nickname");
        response.success(returns);
        console.log(request.user.username + "/purchase deck succeeded--/");
    }, function(error) {
        response.error(error);
    });
});

结果:已经有甲板//即使没有行在User_Deck类。我发现"结果"是未定义的。

问题1:deckQuery做得很好,但userDeckQuery结果未定义的结果:我的代码有什么问题?为了找出原因,我做了很多记录,但这是我唯一找到的东西。

问题2:我正在缓存deckQuery结果到purchaseDeck,对象是否有效,直到这个云函数结束?

提前感谢!

我知道为什么了。
我使用回调样式返回我的查询,并期望得到承诺样式的结果。我用注释标记了

Parse.Cloud.define("req_purchase_deck", function(request, response) {
    var purchaseDeck;
    var deckQuery = new Parse.Query("Deck");
    //deckQuery.get( request.params.deck, function(result) {
    deckQuery.get( request.params.deck ).then( function(result) { // Q1 solved.
        purchaseDeck = result; // Q2 : @Fosco answered that it's fine.
        var userHasQuery = new Parse.Query("User_Deck");
        userHasQuery.equalTo("userId", request.user);
        userHasQuery.equalTo("deckId", result);
        return userHasQuery.find();
    }).then( function( results ) {
        if( /*results == null ||*/results.length == 0 ) { // results never be null
            var userCoin = request.user.get("coin");
            var priceCoin = purchaseDeck.get("priceCoin");
            if( userCoin >= priceCoin ) {
                console.log("/purchase made/" + userCoin + " - " + priceCoin + " = " + userCoin - priceCoin);
                request.user.set("coin", userCoin - priceCoin);
                return request.user.save();
            }
            else {
                return Parse.Promise.error("not enough coins");
            }
        }
        else {
            return Parse.Promise.error("already has deck");
        }
    }).then( function(result) {
        var newUserDeckObject = new Parse.Object("User_Deck");
        newUserDeckObject.set("userId", request.user);
        newUserDeckObject.set("deckId", purchaseDeck);
        console.log("/purchase deck added");
        return newUserDeckObject.save();
    }).then( function(result) {
        var returns = {};
        returns["userCoins"] = request.user.get("coin");
        returns["purchasedDeck"] = purchaseDeck.get("nickname");
        response.success(returns);
        console.log(request.user.username + "/purchase deck succeeded--/");
    }, function(error) {
        response.error(error);
    });
});

现在的结果是"not enough coin"