Azure移动服务器脚本 - 从另一个表中获取列值

时间:2013-05-01 04:45:55

标签: azure azure-storage azure-mobile-services

我正在使用Azure移动服务。我有两个表,我想要做的是从TableA中获取一个列值,通过在TableB上运行插入时检查它与TableB中的列值匹配的位置。

我的插入服务器脚本如下:

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中提取正确的行,但是当我在setItemColumnValue函数中输入console.log(result)时,它会打印undefined。

我发现的所有文档显示的代码与我的相似,但我无法弄清楚我哪里出错了。 任何帮助表示赞赏!!

1 个答案:

答案 0 :(得分: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' });
        }
    }
}