我有一个简单的Node / Express应用程序,我正在尝试将数据从javascript函数传递到模板(由jade提供支持)。
javascript函数如下所示:
module.exports = {
getFeatures: function() {
var request = require("request")
// ID of the Google Spreadsheet + Base URL
var spreadsheetID = "abcdefg-123456";
var sheetID = "od6";
var url = "https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/" + sheetID + "/public/values?alt=json";
//empty array for features
var features = [];
//get the features
request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
var data = body.feed.entry;
data.forEach(function(item) {
var obj = {
pub: item.gsx$publication.$t,
date: item.gsx$date.$t,
title: item.gsx$title.$t,
url: item.gsx$url.$t,
}
features.push(obj);
});
console.log("features", features"); //prints array containing all objects to server console
return features;
}
});
}
};
主应用程序看起来像这样:
'use strict';
var express = require('express');
var jade = require('jade');
var gsheets = require("./gsheets.js"); //pulls in module.exports from above
var featuresOld = require('../private/features.json'); //original json pull (a single array of objects)
var port = process.env.PORT || 3000;
var app = express();
// defining middleweare
app.use('/static', express.static(__dirname + '../../public'));
app.set('view engine', 'jade');
app.set('views', __dirname + '/templates');
...
// features route
app.get('/features', function(req, res) {
var path = req.path;
res.locals.path = path;
var features = gsheets.getFeatures(); //attempting to call js function above
res.render('features', {features: features}); //trying to pass data into a template
});
第一个函数成功地将一个对象数组打印到服务器控制台,所以我认为错误在于我如何在主app.js中调用它。 (请注意,仅当我将其输入gsheets.getFeatures();
而不是var features = gsheets.getFeatures();
时,才会进行打印。)
另请注意,featuresOld
变量是已成功传递给玉石tempalte的对象数组,因此错误不在res.render('features', {features: features});
行。
我确信这很简单,但我似乎无法弄明白。非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
我建议您查看Promises(Native或使用像Bluebird这样的库)。 但是,如果不使用Promises或生成器并保持简单,您可以传递一个仅在检索值时才会调用的回调函数。在此功能中,您可以渲染模板。
(请注意,您的功能目前不返回任何内容)
boost::container::vector<bool>
现在在您的主应用程序中,您只需将回调函数传递给函数
std::vector<bool>
基本上,您的请求函数是异步的 - 请求将在后台运行,并且一旦检索到该值就会调用回调函数。与此同时,其余的代码将继续运行(在您的情况下,您尝试使用该值,即使它尚未被检索)。 如果你需要做一些取决于该值的事情,那么你必须将该代码放在一个回调函数中,当函数值可用时将调用该函数(如上所示)。 Promises提供了一个很好的API来做到这一点。 ES6还有一些新功能可以帮助您更好地组织异步代码。