2013-05-01 3 views
0

Я работаю с Azure Mobile Services. У меня две таблицы, а то, что я пытаюсь сделать, - это захватить значение столбца из таблицы А, проверив, где оно совпадает со значением столбца из TableB, когда я запускаю вставку в TableB.Azure Mobile Server Script - получить значение столбца из другой таблицы

Мой серверный скрипт вставки выглядит следующим образом:

function insert(item, user, request) { 

    var TableA_Table = tables.getTable('TableA'); 

    tableA_Table 
     .where({ columnValue: item.columnValue }) 
     .read ({ success: setItemColumnValue }); 

    request.execute(); 

    function setItemColumnValue(result) 
    { 
     item.tableA_id = result.id; 
    } 
} 

Я подтвердил, что моя команда tableA_Table.where тянет правильную строку из TableA, но когда я вхожу в console.log (результат) в пределах setItemColumnValue, он печатает undefined.

Вся документация, которую я нашел, показывает код, похожий на мой, но я просто не могу понять, где я ошибаюсь. Любая помощь приветствуется !!

ответ

2

В вашем скрипте есть несколько проблем. Во-первых, вы должны помнить, что код доступа к таблице является асинхронным. Случается, что функция является функцией обратного вызова 'setItemColumnValue' вызывается только после request.execute();, что означает, что элемент будет вставлен без набора элементов tableA_id. Другая проблема заключается в том, что обратный вызов успеха read возвращает массив результатов, а не один результат (как и оператор SQL SELECT FROM), так что массив не имеет поля id - его члены имеют его. Попробуйте переписать код так или иначе как код ниже, и это должно сработать.

function insert(item, user, request) { 

    var TableA_Table = tables.getTable('TableA'); 

    tableA_Table 
     .where({ columnValue: item.columnValue }) 
     .read ({ success: setItemColumnValue }); 

    function setItemColumnValue(results) 
    { 
     if (results.length === 0) { 
      // what should it do if there is no matching on table A? 
      // Assuming here that this is an error. 
      request.respond(statusCodes.BAD_REQUEST, { error: 'No matching item in table A' }); 
     } else if (results.length === 1) { 
      item.tableA_id = results[0].id; 
      request.execute(); 
     } else { 
      // what should it do if there are multiple matches on table A? 
      // Assuming here that this is an error. 
      request.respond(statusCodes.BAD_REQUEST, { error: 'Multiple matches in table A' }); 
     } 
    } 
} 
+0

Thanks Carlos! Я обновил свой код, как вы упомянули, теперь я напрямую обращаюсь к значениям id элементов массива, и теперь я понимаю асинхронный характер функций обратного вызова. Единственная оставшаяся проблема, с которой я сталкиваюсь, заключается в том, что Azure выбрасывает «Error: Execute не может быть вызван более одного раза», хотя мой второй request.execute находится в моей функции setItemColumnValue, как вы выложили. Есть идеи? – Naz

+0

Извините, я забыл удалить вызов 'request.execute()' после вызова 'read'. Так как при обратном вызове чтения все пути кода будут отвечать на запрос (либо путем вызова 'request.respond', либо' request.execute'), оригинал больше не требуется. Я обновил код в ответе. – carlosfigueira

+0

Еще раз спасибо Карлос, очень ценится. – Naz