如何从快速中间件函数传递值?

时间:2015-12-30 10:34:59

标签: javascript node.js facebook facebook-graph-api express

我是Javascript / Node / Express的初学者。

我正在尝试从Facebook Graph API获取一些数据并具有Express中间件功能,如下所示。

我想要达到的目的是: -

从Facebook获取用户身份验证令牌 - 完成 将该用户身份验证令牌传递给中间件功能 - 完成 检索数据并将其作为图形显示在屏幕上 - 使用chart.js作为前端图表,但我无法在那里发送数据。

function getFBData(req, res, next){
var impressions = [];
var dates = [];
graph.setAccessToken(req.user.facebook.token);
//graph.get("me/accounts", function(err,res){
// console.log(res);
//});

//var impressions = [];
//var dates = [];
graph.get("{page-id-placeholder}/insights/page_impressions/day",function(err,res){

//console.log(res);
//console.log(res.data[0]);
for(i=0; i<res.data[0].values.length; i++){
setArrayData(impressions, res.data[0].values[i].value);
setArrayData(dates, res.data[0].values[i].end_time);
}

console.log("inside!!");
console.log(impressions);
console.log(dates);

});

function setArrayData(array, value){
console.log("Pushing " + value + "into " + array);
array.push(value);
console.log("Now the array contains " + array);
}

console.log("Impressions = " + impressions);
console.log("Dates = " + dates);
res.locals.FBData = [impressions, dates]
console.log(res.locals.FBData);
return next();

}

现在我遇到的问题是在res.locals.FBData中设置时数组是空的

我认为我在基本的javascript中做错了但却无法确定它是什么。

编辑: - 我能够通过函数setArrayData以及graph.get语句console.log中的内容看到数组中设置的值,但是数组在外面是空的。

我的假设是数组的展示次数和日期在此函数的范围内都是全局的,不应重置。

我哪里错了?

2 个答案:

答案 0 :(得分:0)

替换此行:

return next();

next();

在中间件中,下一个函数可以帮助您将数据传递给下一个中间件。

答案 1 :(得分:0)

Graph.get是异步的。你需要这样做:

function getFBData(req, res, next){
    var impressions = [];
    var dates = [];

    graph.setAccessToken(req.user.facebook.token);

    graph.get("{page-id-placeholder}/insights/page_impressions/day",function(err,res){

        for(i=0; i<res.data[0].values.length; i++){
            impressions.push(res.data[0].values[i].value);
            dates.push(res.data[0].values[i].end_time);
        }

        console.log("Impressions = " + impressions);
        console.log("Dates = " + dates);
        res.locals.FBData = [impressions, dates]
        console.log(res.locals.FBData);
        return next();

    });

}