可以打印出一个对象,但无法在 JS 中访问它的值
Can print out an object, but cannot access its values in JS
我知道这将是一个非常愚蠢的问题,但我一直在绞尽脑汁想弄明白这个问题。我从我正在使用的 API 收到以下回复:
{
"item_id": "51c3d78797c3e6d8d3b546cf",
"item_name": "Cola, Cherry",
"brand_id": "51db3801176fe9790a89ae0b",
"brand_name": "Coke",
"item_description": "Cherry",
"updated_at": "2013-07-09T00:00:46.000Z",
"nf_ingredient_statement": "Carbonated Water, High Fructose Corn Syrup and/or Sucrose, Caramel Color, Phosphoric Acid, Natural Flavors, Caffeine.",
"nf_calories": 100,
"nf_calories_from_fat": 0,
"nf_total_fat": 0,
"nf_saturated_fat": null,
"nf_cholesterol": null,
"nf_sodium": 25,
"nf_total_carbohydrate": 28,
"nf_dietary_fiber": null,
"nf_sugars": 28,
"nf_protein": 0,
"nf_vitamin_a_dv": 0,
"nf_vitamin_c_dv": 0,
"nf_calcium_dv": 0,
"nf_iron_dv": 0,
"nf_servings_per_container": 6,
"nf_serving_size_qty": 8,
"nf_serving_size_unit": "fl oz",
}
这是我正在尝试的代码 运行:
var rp = require('request-promise');
module.exports = {
getIngredients: function(req, callback) {
rp({
method: 'GET',
uri: `https://api.nutritionix.com/v1_1/item?upc=${req.body.upc}&appId=${process.env.NUTRITIONIX_APP_ID}&appKey=${process.env.NUTRITIONIX_APPP_KEY}`
}).then((data) => {
console.log(`Talked to NutritionixAPI, result was: ${data}`);
var ingredients = data.nf_ingredient_statement.split(',');
console.log(`Ingredients split from the data are: ${ingredients}`);
return callback(ingredients);
}).catch((err) => {
console.log(`Error occured in NutritionixAPI, ${err}`)
return callback(Object.assign({}, err, { error: true }));
});
}
}
我想弄清楚的是为什么 data
正确地打印到控制台,但是当我尝试访问其中的任何值时,我得到的错误是 undefined
.我也在 JSON 中尝试了其他值,因此非常感谢您的帮助!
编辑: 我想澄清一下问题是什么,这与回调和异步调用无关,因为它们工作得很好。我的问题特别针对 var ingredients = data.nf_ingredient_statement.split(',');
,其中 nf_ingredient_statement
未定义,尽管显然不是。
问题是 data
是一个 JSON 字符串,所以在解析它之前你不能访问它,这就是为什么 data.nf_ingredient_statement
是 undefined
.
你需要先解析data
,你的代码应该是这样的:
var json = JSON.parse(data);
var ingredients = json.nf_ingredient_statement.split(',');
显然我得到的是 JSON 字符串。所以我只需要做 data = JSON.parse(data)
把它解析成实际的 JSON.
我知道这将是一个非常愚蠢的问题,但我一直在绞尽脑汁想弄明白这个问题。我从我正在使用的 API 收到以下回复:
{
"item_id": "51c3d78797c3e6d8d3b546cf",
"item_name": "Cola, Cherry",
"brand_id": "51db3801176fe9790a89ae0b",
"brand_name": "Coke",
"item_description": "Cherry",
"updated_at": "2013-07-09T00:00:46.000Z",
"nf_ingredient_statement": "Carbonated Water, High Fructose Corn Syrup and/or Sucrose, Caramel Color, Phosphoric Acid, Natural Flavors, Caffeine.",
"nf_calories": 100,
"nf_calories_from_fat": 0,
"nf_total_fat": 0,
"nf_saturated_fat": null,
"nf_cholesterol": null,
"nf_sodium": 25,
"nf_total_carbohydrate": 28,
"nf_dietary_fiber": null,
"nf_sugars": 28,
"nf_protein": 0,
"nf_vitamin_a_dv": 0,
"nf_vitamin_c_dv": 0,
"nf_calcium_dv": 0,
"nf_iron_dv": 0,
"nf_servings_per_container": 6,
"nf_serving_size_qty": 8,
"nf_serving_size_unit": "fl oz",
}
这是我正在尝试的代码 运行:
var rp = require('request-promise');
module.exports = {
getIngredients: function(req, callback) {
rp({
method: 'GET',
uri: `https://api.nutritionix.com/v1_1/item?upc=${req.body.upc}&appId=${process.env.NUTRITIONIX_APP_ID}&appKey=${process.env.NUTRITIONIX_APPP_KEY}`
}).then((data) => {
console.log(`Talked to NutritionixAPI, result was: ${data}`);
var ingredients = data.nf_ingredient_statement.split(',');
console.log(`Ingredients split from the data are: ${ingredients}`);
return callback(ingredients);
}).catch((err) => {
console.log(`Error occured in NutritionixAPI, ${err}`)
return callback(Object.assign({}, err, { error: true }));
});
}
}
我想弄清楚的是为什么 data
正确地打印到控制台,但是当我尝试访问其中的任何值时,我得到的错误是 undefined
.我也在 JSON 中尝试了其他值,因此非常感谢您的帮助!
编辑: 我想澄清一下问题是什么,这与回调和异步调用无关,因为它们工作得很好。我的问题特别针对 var ingredients = data.nf_ingredient_statement.split(',');
,其中 nf_ingredient_statement
未定义,尽管显然不是。
问题是 data
是一个 JSON 字符串,所以在解析它之前你不能访问它,这就是为什么 data.nf_ingredient_statement
是 undefined
.
你需要先解析data
,你的代码应该是这样的:
var json = JSON.parse(data);
var ingredients = json.nf_ingredient_statement.split(',');
显然我得到的是 JSON 字符串。所以我只需要做 data = JSON.parse(data)
把它解析成实际的 JSON.