Может распечатать объект, но не может получить доступ к его значениям в 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 не определено, хотя, очевидно, это не так.

2 ответа

Решение

Проблема в том, что 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.

Другие вопросы по тегам