DudeMontag
DudeMontag

Reputation: 139

How to correctly read data from a table storage binding?

I have a Node function that receives get requests from an internal api, does some attribute assignment, and spits back a JSON response. Initially, I set it up with a bunch of hard-coded constants, but we decided to move those values over to a storage table, so that we don't have to change the values in the function itself, if we need to raise our prices in the future. I followed the docs for creating a storage table, populated it, and configured my function to bind to it. As far as I can tell, I'm calling it correctly, but I'm getting a "TypeError: cannot read property x". Here's what my function.js looks like:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "GET"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "table",
      "name": "rate",
      "tableName": "Rates",
      "partitionKey": "Production",
      "rowKey": "Standard",
      "connection": "{TABLE_CONNECTION_STRING}",
      "direction": "in"
    }
  ],
 "disabled": false
}

And my index.js looks like this:

module.exports = function (context, req) {
    context.log('Processing mailing');

    if (req.query.number_of_pages && req.query.delivery_country) {
        const first_page_special_domestic = context.bindings.rate.first_page_special_domestic;
        const addtl_page_special_domestic = context.bindings.rate.addtl_page_special_domestic;
        const express_domestic = context.bindings.rate.express_domestic;
        const certified = context.bindings.rate.certified;
        const tracking = context.bindings.rate.tracking;
        const registered = context.bindings.rate.registered;
        const return_envelope = context.bindings.rate.return_envelope;
        const first_page_special_international = context.bindings.rate.first_page_special_international;
        const addtl_page_special_international = context.bindings.rate.addtl_page_special_international;
        const first_page_international = context.bindings.rate.first_page_international;
        const addtl_page_international = context.bindings.rate.addtl_page_international;
        const express_international_flat_rate = context.bindings.rate.express_international_flat_rate;

        var number_of_pages = req.query.number_of_pages;
        var delivery_country = req.query.delivery_country;
        var flat_cost = 0.0;
        var per_page_cost = 0.0;
        var cost = 0.0;
        var tax = 0.0;
        var discount = 0.0;
        var first_page_domestic = context.bindings.rate.first_page_domestic;
        var addtl_page_domestic = context.bindings.rate.addtl_page_domestic;

        if (req.query.rate == 1) {
            first_page_domestic = context.bindings.rate.first_page_domestic_discount_one;
            addtl_page_domestic = context.bindings.rate.addtl_page_domestic_discount_one;
        }
        else if (req.query.rate == 2) {
            first_page_domestic = context.bindings.rate.first_page_domestic_discount_two;
            addtl_page_domestic = context.bindings.rate.addtl_page_domestic_discount_two;
        }

        if (delivery_country == "US") {
            if (req.query.special_paper) {
                flat_cost = first_page_special_domestic;
                per_page_cost = addtl_page_special_domestic;
            }
            else {
                flat_cost = first_page_domestic;
                per_page_cost = addtl_page_domestic;
            }
            if (req.query.tracking) flat_cost += tracking;
            if (req.query.certified) flat_cost += certified;
            if (req.query.registered) flat_cost += registered;
            if (req.query.express) flat_cost += express_domestic;
            if (req.query.return_envelope) flat_cost += return_envelope;
        }
        else {
            if (req.query.special_paper) {
                flat_cost = first_page_special_international;
                per_page_cost = addtl_page_special_international;
            }  
            else {
                flat_cost = first_page_international;
                per_page_cost = addtl_page_international;
            }
            if (req.query.express) flat_cost += express_international_flat_rate;
            if (req.query.return_envelope) flat_cost += return_envelope;
        }

        if (number_of_pages > 1) {
            cost = ((number_of_pages - 1) * per_page_cost) + flat_cost;
        }
        else {
            cost = flat_cost;
        }

        cost = cost.toFixed(2);

        if (req.query.state_tax == "true" && delivery_country == "US") {
            tax = 0.095;
        }

        context.res = {
            status: 200,
            body: { "cost": cost, 
                    "tax": tax 
            }
        };
    }
    else {
        context.res = {
            status: 421,
            body: "Unprocessable Entity"
        };
    }
    context.done();
};

The error message is referring to the first const declared, first_page_special_domestic. My sense is that I've configured it incorrectly in some way, in my function.js. Any help would be appreciated!

Upvotes: 1

Views: 55

Answers (1)

Aaron Chen
Aaron Chen

Reputation: 9950

Basically, you can just use rate as the function parameter to get those values.

Please change your code as below:

module.exports = function (context, req, rate) {
    context.log('Processing mailing');

    if (req.query.number_of_pages && req.query.delivery_country) {
        const first_page_special_domestic = rate.first_page_special_domestic;
        //...
    } else {
        //...
    }
    context.done();
}; 

Upvotes: 1

Related Questions