如何从我的快递中间件功能中传递值?
问题描述:
我是Javascript/Node/Express的初学者。如何从我的快递中间件功能中传递值?
我想从Facebook Graph API获取一些数据,并具有Express中间件功能,如下所示。
我想实现的是: -
获得来自Facebook的用户身份验证令牌 - 完成 传递用户身份验证令牌中间件功能 - 完成 检索数据,并在屏幕的上显示graph - 使用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中看到数组中设置的值,但数组在外面是空的。
我的假设是数组展示和日期在范围内都是全局的,并且不应该被重置。
我哪里错了?
答
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();
});
}
答
替换此行:
return next();
与
next();
在中间件接下来的功能可帮助您将数据传递到下一个中间件。
我不是在这一点本身 的console.log(“印象=” +感想)得到的值; console.log(“Dates =”+ dates); res.locals.FBData = [印象,日期] console.log(res.locals.FBData); –