2015-04-07 3 views
0

Прежде чем положить это на облачный код, я проверил его в Angular с успехом, создав правильные ответы console.log во всей программе. Поскольку эта функция управляет данными в пользовательской таблице, она должна использовать главный ключ и находиться в облачном коде. С помощью этого кода в облаке он сохраняет столбец «долг» в таблице пользователя, но без данных (есть данные для сохранения, это я уверен). Более того, я даже не уверен, что код проходит мимо первого Parse Query, поскольку console.log ничего не возвращает в журналах анализа. Где я иду не так?Функция облачного кода не сохраняет данные

'use strict'; 
var express = require('express'); 
var app = express(); 
app.use(express.bodyParser()); 
var _ = require('underscore'); 
var server = require('http').createServer(app); 

Parse.Cloud.define("updateMerchant", function(request, response) { 
Parse.Cloud.useMasterKey(); 
var user = Parse.Object.extend("User") 
var merchantQuery = new Parse.Query(Parse.User); 
var Offers = Parse.Object.extend("Offer"); 
var offerQuery = new Parse.Query(Offers); 
var Matches = Parse.Object.extend("Matched"); 
var matchQuery = new Parse.Query(Matches); 

var merchantDuty = []; 
var merchants = request.params.data;//I confirmed the validity of this a key value pair where the value is an array of objects. 
var merchantIds = _.map(merchants, function(n){return n.id}); 
console.log(merchantIds) 

offerQuery.containedIn("user", merchants); 
offerQuery.limit(1000); 
offerQuery.find({//CODE STOPS RUNNING?!? 
    success: function (offers) { 
      var offerIds = _.map(offers, function (n) { 
         return n.id}); 

console.log(offers)//this is telling as it does not appear in the Parse log! 

var offersBeta = _.map(offers, function (n) { 
return _.extend(_.find(n), {id: n.id})}); 

    matchQuery.containedIn("offer", offers); 
    matchQuery.limit(1000); 
    matchQuery.find({ 
      success: function (matches) { 
        var merchantArray = _.map(_.flatten(matches), function (n) {return _.find(n)}); 

var offers3 = _.map(offersBeta, function (n) {return _.extend(n, { 
Matched: _.filter(merchantArray, function (a) {return a.offer.id == n.id})})}) 

var duty = function (TotalBill, id) { 
var promise = new Parse.Promise(); 
merchantQuery.get(id, { 
    success: function (merchantBill) { 
      merchantBill.set("duty", TotalBill); 
      merchantBill.save().then(function(obj){ console.log(obj); }, function(error){console.log(error)})}})} 

merchantDuty.push(duty(_.map(offer9, function(n){return n.TotalBill}), _.map(offer9, function(n){return n.id}))); 
}, 
error: function(){console.log(error); 
} 
}) 
} 
}) 
//Code begins running again! 

return Parse.Promise.when(merchantDuty).then(function() { 

response.success("Success"); 
}, 
function(error) {response.error("Something is still wrong"); 
console.log(error);}) 
}) 

Чтобы быть более понятным, ничего не происходит между предложениемQuery.find и возвратом Parse.Promise.

+0

merchantIds распечатывается в журналах, правильно? – Ralphilius

+0

@kodingralph, что правильно, но ничего не найдено между предложениемQuery.find и оператором return в журналах. – rashadb

ответ

1

Вам необходимо указать указатели в offerQuery.containedIn("user", merchants);. См. this.

Попробуйте это:

var _ = require('underscore'); 


Parse.Cloud.define("updateMerchant", function(request, response) { 
    Parse.Cloud.useMasterKey(); 

    var merchantDuty = []; 
    var merchants = request.params.data;//I confirmed the validity of this a key value pair where the value is an array of objects. 

    // var merchantIds = _.map(merchants, function(n) {return n.id;}); 
    // console.log(merchantIds); 

    // Since I don't have the merchants request parameter, I'll fake it with some fake users 
    var fakeMerchants = [{"username":"Batman","objectId":"f7zZkPx7kT","createdAt":"2015-04-07T19:41:25.014Z","updatedAt":"2015-04-07T19:41:25.014Z","__type":"Object","className":"_User"},{"username":"Robin","objectId":"wgG4EfaFN1","createdAt":"2015-04-07T19:41:35.024Z","updatedAt":"2015-04-07T19:41:35.024Z","__type":"Object","className":"_User"}]; 
    // We can get some users like this: 
    // var fakeMerchantsQuery = new Parse.Query(Parse.User); 
    // fakeMerchantsQuery.find().then(function(users) { 
    // console.log(users); 
    // }); 

    // Since the 'user' column in Offer Class is a pointer, we need to pass merchant pointers. 
    // Otherwise we get the error "pointer field user needs a pointer value" 
    // See https://www.parse.com/questions/using-containedin-with-array-of-pointers 
    var fakeMerchantsPointers = _.map(fakeMerchants, function(merchant) { // TODO change to real merchants 
    var pointer = new Parse.User(); 
    pointer.id = merchant.objectId; 
    return pointer; 
    }); 

    console.log(fakeMerchantsPointers); 

    var offerQuery = new Parse.Query(Parse.Object.extend("Offer")); 
    offerQuery.containedIn("user", fakeMerchantsPointers); // TODO change to real merchants 
    offerQuery.limit(1000); 
    offerQuery.find().then(function(offers) { 

    console.log("inside offer query"); 
    console.log(offers); 

    // Here I assume that the column 'offer' is a Pointer 
    var matchQuery = new Parse.Query(Parse.Object.extend("Matched")); 
    matchQuery.containedIn("offer", offers); 
    matchQuery.limit(1000); 
    return matchQuery.find(); 

    }).then(function(matches){ 

    console.log("inside matches query"); 
    console.log(matches); 

    // Add the duty stuff here...   

    // We must call success or error 
    response.success("Success"); 

    }); 

}); 

Позвольте мне знать, если он работал.

Обратите внимание, что вы не должны смешивать облачный код с кодом ExpressJS. Код облака должен быть в main.js, а код ExpressJS - app.js. Затем в Cloud Code main.js позвоните по номеру require('cloud/app.js');, если вы хотите, чтобы запрос проходил через ExpressJS.

1

Выполнение строки return Parse.Promise.when(merchantDuty) перед выполнением каких-либо обещаний в массиве merchantDuty (инициализировано как пустое). Таким образом, вся функция заканчивается перед поиском функции поиска.

Я думаю, что если вы создадите и добавите обещания запроса в массив merchantDuty, вы исправите свою ошибку.

Я также предлагаю вам использовать алгоритмы взаимозаменяемости для методов запросов. Нравится:

query.find().then(function(){ 
    //success 
}, function(error){ 
    //error 
}); 

Затем вы можете связать их, вернув другое обещание и сделайте код более структурированным.

+0

Это не совсем сработало, но это важный шаг ближе. Мне нужно связать все это, как выбранный ответ. – rashadb

Смежные вопросы