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)
        }
    });
}
2
  • 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? Commented Mar 1, 2019 at 12:27
  • See the accepted answer below - I guess it wasn't returning a promise, and I misunderstood what await would do. Thanks. Commented Mar 1, 2019 at 13:24

1 Answer 1

9

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)
        }
    });
});
}
Sign up to request clarification or add additional context in comments.

2 Comments

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!
@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).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.