Reputation: 139
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
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