4

I'm attempting to use the Azure storage SDK for node to create a Table in Table Store, if it does not exist.

The following code is valid and returns a 200 response, although there is no response content. However, the table is created as expected.

Upon investigation, I can see that the Azure Function app is logging the following -

Creating table 'Test'.
[warn] Warning: Unexpected call to 'log' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to 'done' made before function execution completes.

So it seems that while the createTableInTableStore is working as expected, the async/await part of my function is not. I suspect that I'm doing something wrong, but from the looks of it I am correctly implementing await as and when it's requried.

How can I get the function to wait for the createTableInTableStore method to complete before it move on?

Example code

Please note that the azure-storage npm package is required (npm install azure-storage).

module.exports = async function (context) {
    var azure_storage = require('azure-storage');
    var table_service = azure_storage.createTableService(process.env["AzureWebJobsStorage"]);
    var create_table_result = await createTableInTableStore(context, table_service, "Test");
    return {
        res: create_table_result
    };
};

async function createTableInTableStore(context, table_service, table_name) {
    context.log("Creating table '"+table_name+"'.");
    return await table_service.createTableIfNotExists(table_name, function(error, result, response) {
        if (!error && result) {
            context.log.info("[Info] Table created successfully.")
        } else if (!error && !result) {
            context.log.info("[Info] Table already exists.")
        }
        if (error) {
            context.log.error("[Error] An unexpected error occurred.")
            context.log.error(" -----> " + response)
        }
    });
}
David Gard
  • 11,225
  • 36
  • 115
  • 227
  • 1
    I'm not sure if you need these two await statement, so did you try to remove the second one? And the `table_service.createTableIfNotExists` returns a promise? – BrTkCa Mar 01 '19 at 12:27
  • See the accepted answer below - I guess it wasn't returning a promise, and I misunderstood what `await` would do. Thanks. – David Gard Mar 01 '19 at 13:24

1 Answers1

8

you can return a promise it will work. and use try catch to handle errors when you use await.

module.exports = async function (context) {
    try{
    var azure_storage = require('azure-storage');
    var table_service = azure_storage.createTableService(process.env["AzureWebJobsStorage"]);
    var create_table_result = await createTableInTableStore(context, table_service, "Test");
      return {
          res: create_table_result
      };
    }catch(err){
    //handle errr
    console.log(err);
     }
};

function createTableInTableStore(context, table_service, table_name) {
    context.log("Creating table '"+table_name+"'.");
    return new Promise((resolve, reject) => {
      table_service.createTableIfNotExists(table_name, function(error, result, response) {
        if (!error && result) {
            context.log.info("[Info] Table created successfully.")
            resolve(result)
        } else if (!error && !result) {
            context.log.info("[Info] Table already exists.")
            resolve(response)
        }
        if (error) {
            context.log.error("[Error] An unexpected error occurred.")
            context.log.error(" -----> " + response)
            reject(error)
        }
    });
});
}
empz
  • 11,509
  • 16
  • 65
  • 106
Yogesh.Kathayat
  • 974
  • 7
  • 21
  • 2
    Many thanks, that seems to do the job. I assumed that the promise creation was automatic when using await, so that's where I was going wrong - I'll know better for next time! – David Gard Mar 01 '19 at 13:22
  • @DavidGard async functions do return promises. The problem here was probably something else. Also, it doesn't make sense to mark a function as `async` if you're not using `await` inside. Your original code was awaiting a function that doesn't return a promise.`table_service.createTableIfNotExists` is callback-based, not promise-based. You need to promisify it if you want to be able to use async/await, just like this answer does (except it doesn't need to be marked as async). – empz Apr 19 '20 at 11:55