2017-07-10 14 views
0

私はユーザーの言語をから取得しようとしています。ユーザー Parse Cloudにあります。 langユーザークラスの列の1つです。私はlangを取得します。私の全体のクラウドコードは(それが動作しませんでした)次のとおりです。Parse Cloud - objectIdでユーザー情報を取得

Parse.Cloud.beforeSave('Order', function(request, response) { 

    var orderState = request.object.get('orderState'); 
    var subtitleMessage = ''; 

    var userLang = ''; 
    var currentUser = request.object.get('user'); 
    var userQuery = new Parse.Query(Parse.User); 
    userQuery.equalTo('objectId', currentUser.id); 
    .find() 
    .then((result)=>{ 
     userLang = result.get('lang'); 
    }) 

    if (orderState === undefined || ['nonApproved', 'approved', 'delivered', 'canceled'].indexOf(orderState) < 0) { 
     response.error("OrderState is null or not one the ['nonApproved', 'approved', 'delivered', 'canceled']!"); 
    } else { 
     var query = new Parse.Query(Parse.Installation); 
     query.include('user'); 
     query.equalTo('user', request.object.get('user')); 

     Parse.Push.send(
      { 
       where: query, 
       data: { 
        title: "MyTitle", 
        alert: subtitleMessage 
       } 
      }, 
      { 
       success: function() { 
       }, 
       error: function(error) { 
        response.error(error) 
       }, 
       useMasterKey: true 
      } 
     ); 
     response.success(); 
    } 
}); 
+0

「それはうまくいかない」以外の詳細を提供できますか?たとえば、ログに記録されたエラーや予期しない動作はありましたか?また、promiseハンドラに 'userLang'を割り当てて、どこにも使用していないようです。 – JeremyPlease

+0

エラーはありませんでした。 'userLang'を記録すると' undefined 'になります。私はすべてのユーザーの優先言語に応じてプッシュ通知をユーザーに送信したいと考えています。だから私はParseから 'lang'を手に入れたいと思っています。 –

答えて

1

Jake T.の答えにはいくつかの点があります。彼の答えと質問に対するあなたのコメントに基づいて、次のようなものを試すことができます:

Parse.Cloud.beforeSave('Order', function(request, response) { 
    var currentUser = request.object.get('user'); 
    currentUser.fetch({useMasterKey: true}).then(function(user) { 
    var userLang = user.get('lang'); 
    // send push notifications based on userLang here 
    response.success(); 
    }).catch(function(error) { 
    // handle any errors here 
    console.error(error); 
    }); 
}); 
+0

私はそれが 'result.get( 'lang')'の代わりに 'user.get( 'lang')'であるべきだと思います。私は正しい? –

+1

確かに。回答が更新されました! – JeremyPlease

+0

私はあなたのコードを試しましたが、成功しませんでした。 'null 'を返します。 –

0

は、あなたがしなければ、あなただけの場合を除き、代わりにクエリを実行するcurrentUser.fetch()を呼び出すことができ、あなたが実際にrequest.object.get("user");からユーザーオブジェクトのシェルを持って確認し、あなたが含める必要があるかもしれない他のオブジェクトがあります。

クエリーを使用していたため、返されるオブジェクトが1つしかない場合でも、結果は配列になります(まったくない場合は、単に[]となります)。だから、あなたは何もしてはならないArray.get("lang")をしています。 if(results && results.length > 0) user = results[0];を試してみると、アクセスできるはずですuser.get("lang");

ユーザークラスにACL/CLPが設定されている必要があります。理想的には、これらはユーザーまたはマスターでないユーザーがアクセスできないようにする必要があります。したがって、それが適切に設定されていれば、あなたの解決策はオプションとしてクエリ/フェッチに{useMasterKey:true}を渡している可能性があります。

+0

私は 'request.object.get(" user ");'のように、 '{" objectId ":" XXXXXXXXXX "}'からユーザーのIDだけにアクセスできると確信しています。だから私はユーザの 'lang'や' username'にアクセスするために新しいクエリを実行しました: 'var userQuery = new Parse.Query(Parse.User); userQuery.equalTo( 'objectId'、currentUser.id); '返されるオブジェクトは1つだけです。 –

関連する問題