Как использовать таблицы хранения Azure в функции Azure? - PullRequest
0 голосов
/ 25 июня 2019

Боюсь, это может быть простой случай, когда я совершенно не понимаю, как работает асинхронный.

Я работаю с модулем NPM azure-storage.Проблема, с которой я столкнулся, заключается в том, что эта функция завершается до выполнения обратного вызова.Что еще хуже, в функциях Azure есть какая-то магия, заключающаяся в том, что вы «завершаете» свою функцию, устанавливая свойство context.res.

Раньше они требовали, чтобы вы вызывали context.done(), но что-то изменилось с v1 на v2, и теперь ядумаю, это уже не так.Но все же, даже если бы это было так, функция была бы завершена до выполнения обратного вызова.

Что еще хуже, моя сущность даже не вставляется, но я не могу сказать, почему.

var azure = require('azure-storage');
var validate = require('validate.js');

var constraints = {
    PartitionKey: {
        presence: true,
        email: true
    },
    description: {
        presence: true
    },
    dueDate: {
        presence: true
    }
};

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (!(req.body && req.body.PartitionKey)
        || !(req.body && req.body.description)
        || !(req.body && req.body.dueDate)) {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }

    var tableSvc = azure.createTableService();
    var input = req.body;

    context.log('PartitionKey: ' + input.PartitionKey);
    context.log('description: ' + input.description);
    context.log('dueDate: ' + input.dueDate);

    context.log(validate({ PartitionKey: input.PartitionKey }, constraints));
    context.log(validate({ description: input.description }, constraints));
    context.log(validate({ dueDate: input.dueDate }, constraints));

    var entGen = azure.TableUtilities.entityGenerator;
    var task = {
        PartitionKey: entGen.String(input.PartitionKey),
        RowKey: entGen.String('1'),
        description: entGen.String(input.description),
        dueDate: entGen.DateTime(input.dueDate)
    };

    tableSvc.insertEntity('events', task, function (error, result, response) {
        if (!error) {
            // Entity inserted
            context.log(result);
            context.res = {
                // status: 200, /* Defaults to 200 */
                body: {
                    result: result,
                    response: response
                }
            };
        }
        else {
            context.log(error);
            context.res = {
                status: 400, /* Defaults to 200 */
                body: error
            };
        }
    });
};

1 Ответ

1 голос
/ 25 июня 2019

При экспорте асинхронной функции вы можете настроить привязку вывода для получения возвращаемого значения.Это рекомендуется, если у вас есть только одна выходная привязка.См. doc

Чтобы назначить вывод, используя return, измените свойство name на $ return в function.json.

{
  "type": "http",
  "direction": "out",
  "name": "$return"
}

В этом случае ваша функция должна выглядетькак в следующем примере:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    // You can call and await an async method here
    return {
        body: "Hello, world!"
    };
}

Это должно работать.

Ваша асинхронная функция не будет ожидать обратного вызова.Вы должны заставить его ждать до завершения обратного вызова.

var azure = require('azure-storage');
var validate = require('validate.js');

var constraints = {
    PartitionKey: {
        presence: true,
        email: true
    },
    description: {
        presence: true
    },
    dueDate: {
        presence: true
    }
};

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (!(req.body && req.body.PartitionKey)
        || !(req.body && req.body.description)
        || !(req.body && req.body.dueDate)) {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }

    var input = req.body;

    context.log('PartitionKey: ' + input.PartitionKey);
    context.log('description: ' + input.description);
    context.log('dueDate: ' + input.dueDate);

    context.log(validate({ PartitionKey: input.PartitionKey }, constraints));
    context.log(validate({ description: input.description }, constraints));
    context.log(validate({ dueDate: input.dueDate }, constraints));

    var entGen = azure.TableUtilities.entityGenerator;
    var task = {
        PartitionKey: entGen.String(input.PartitionKey),
        RowKey: entGen.String('1'),
        description: entGen.String(input.description),
        dueDate: entGen.DateTime(input.dueDate)
    };

    let res = await tablework(task, context);

    if(res.success) {
        return {
            status: 200,
            body: {
                result: res.result,
                response: res.response
            },
            headers: {
                'Content-Type': 'application/json'
            }
        };
    }
    else{

        return {
            status: 400, /* Defaults to 200 */
            body: res.error,
            headers: {
                'Content-Type': 'application/json'
            }
        };
    }

};

function tablework(task, context){
    return (new Promise((resolve, reject) => {
        var tableSvc = azure.createTableService(); 

        tableSvc.insertEntity('events', task, function (error, result, response) {
            if (!error) {
                // Entity inserted
                context.log(result);
                resolve({
                    success: true,
                    result: result,
                    response: response
                });
            }
            else {
                context.log(error);
                resolve({
                    success: false,
                    error: error
                });
            }
        }); 
    }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...