Azure表存储返回查询结果

时间:2018-08-16 01:40:24

标签: javascript azure callback azure-functions azure-table-storage

我正在尝试创建一个Azure函数,该函数将接受参数并返回存储在Azure表中的值。我认为与javascript有关的问题比与Azure Table SDK有关的问题更多。

您应该如何通过http响应从查询中返回值?我已经附上了代码的副本,它应该解释我感到困惑的地方。我的主要困惑是由于我能够通过查询方法中的函数调用context.log()但无法调用context.res{}

我知道范围与它有关,但是在JavaScript和嵌套函数方面我不是专家。一些指导或示例将不胜感激

var azure = require('azure-storage');
module.exports = function (context, req) {
    context.log('Some Function');
    var hostUri = 'https://*******.table.core.windows.net'
    var sasToken = 'abc123'

    if (req.query.value) {
        var tableService = azure.createTableServiceWithSas(hostUri, sasToken)
        var nothing =  tableService.retrieveEntity('Table', 'Partition', 'Row', function(error, result, response) {
            if (!error) {
                context.log('I am able to send data to the logs here')         
                context.res = {
                    status: 200,
                    body: "This is what I am tring to return -> " + JSON.stringify(result) 
                };       
            }
        })
        context.res = {
            status: 200,
            body: "I'm able to get a response here"
        };  
    }
    else {
        context.res = {
            status: 400,
            body: "Somthing went wrong..."
        };
    }
    context.done();
};

1 个答案:

答案 0 :(得分:1)

第一个解决方案:

if (req.query.value) {
    var tableService = azure.createTableServiceWithSas(hostUri, sasToken)
     tableService.retrieveEntity('Table', 'Partition', 'Row', function(error, result, response) {
        if (!error) {
            context.log('I am able to send data to the logs here')         
            context.res = {
                status: 200,
                body: "This is what I am tring to return -> " + JSON.stringify(result) 
            }; 
        }
        else{
            context.res = {
                status: 400,
                body: error
            };
        }
        context.done(); 
    })

}
else {
    context.res = {
        status: 400,
        body: "Value is empty"
    };
    context.done();
}

说明:

为了避免重复,让我们将context.res标记为c1和c2。

您被回调函数抓住。直到从远程服务器检索到实体(否则发生错误),才执行回调function(error, result, response){}。该操作可能需要一些时间,程序在等待完成的同时继续执行,此模式称为asynchronous

因此,回调中的代码片段c1不会立即执行,而是c2会执行。然后context.done();在检索实体之前运行(您会看到响应消息I'm able to get a response here),因此永远不会调用回调。

依赖于回调结果的代码应包含在回调中,以便可以在回调完成后准确执行。将context.done();放在回调和else段中,以确保它不会提前运行。

还有一个blog about asynchronous-javascript供您参考。