2017-05-03 36 views
1

我知道这将是一个非常愚蠢的问题,但我一直在试图弄清楚这一点。我从我使用的是API获得以下响应回:可以打印出一个对象,但不能在JS中访问它的值

{ 
    "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是未定义的,即使它显然不是。

+1

不要采取'回调'。承诺! – Bergi

+0

@Bergi:回调“工作”很好。也许不是首选,但这似乎并不是问题。这里的问题可能是'return callback(...)'中的'return'语句 – Cerbrus

+0

@Cerbrus return语句正常工作,因为回调中的所有内容都可以正常运行。这里的问题是'var ingredients = data.nf_ingredient_statement.split(',');''nf_ingredient_statement'是未定义的。 – ScaVenGerS

回答

0

问题是data是JSON字符串,因此在解析它之前无法访问它,这就是为什么data.nf_ingredient_statementundefined

您需要首先分析data,你的代码应该是这样的:

var json = JSON.parse(data); 
var ingredients = json.nf_ingredient_statement.split(','); 
1

显然,我在大家回来了一个JSON字符串。所以我只需要做data = JSON.parse(data)解析成实际的JSON。

相关问题