如何分配返回数据对象,以便它可以在视图中呈现(node.js)
How to assign return data object so it can be rendered in view (node.js)
我有以下代码,我基本上向我的api请求检索JSON数据并导出此自定义模块。
问题是单独使用var data = require('./lib/data.js');
,数据并不真正具有我期望的数据。
如果它是一个物理JSON文件,我可以做var data = require('./data.json');
,但我不使用这种静态数据。
怎么了?
data.js(我的自定义模块获取JSON数据)
module.exports = function() {
var request = require("request")
var url = "http://sheetsu.com/apis/94dc0db4"
request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
console.log(body)
}
})
}
index.js
var express = require('express');
var router = express.Router();
var data = require('./lib/data.js');
router.get('/', function(req, res, next) {
res.render('index', {
title: 'Express'
data: data
});
});
module.exports = router;
这里有两件事需要考虑:
- 你对服务器的请求是异步的
- 您实际上没有将数据返回给
module.exports
代码中的一些基本语法错误
试试这个:
data.js
module.exports = function(callback) {
var request = require("request")
var url = "http://sheetsu.com/apis/94dc0db4"
request({ url: url, json: true }, function (error, response, body) {
if (!error && response.statusCode === 200) {
callback( body );
}
});
}
index.js
var express = require('express');
var router = express.Router();
var data = require('./lib/data.js');
data( function(data) {
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express', data: data });
});
});
module.exports = router;
更详细一点;获取JSON数据的请求将不是同步的。这意味着它可以用任意数量的时间来响应数据,因此它允许您的程序完成其当前线程。这意味着当您的index.js
文件接收data.js
模块时,数据可能还没有到达。你可以在这里阅读更多关于异步和同步的内容。
我们如何解决这个问题?我们传递给该方法一个callback
函数,当它完成时执行。
当我们执行模块时…
data( function(data) { ...
…我们给它传递一个函数,当它从服务器接收到数据时运行。如果服务器没有错误并且statusCode
是OK的…
if (!error && response.statusCode === 200) { ...
…然后我们调用传递的callback
函数,传递body
(或者数据,如果你喜欢)作为参数…
callback( body );
…然后我们可以在index.js
中使用它…
res.render('index', { title: 'Express', data: data });
相关文章:
- angular.js没有'无法在PhoneGap中处理视图标记
- backbone.js无法渲染视图
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 删除移动视图粘性js上的粘性导航栏
- Backbone.js将模型绑定到视图时出错
- 如何在渲染视图时将变量传递给Node.js中的脚本标记
- Backbone.js视图中的多个模型
- 带有jquery插件的backbone.js视图
- node.js/javascript/couchdb视图到关联数组似乎不起作用
- 使用knockout.js将数组绑定到视图模型
- 如何在主干js中解析视图中的消息
- 似乎无法将功能绑定到骨干网中的视图.js
- 嵌套依赖主干.js具有 require.js 主干的视图.js导致视图作为对象而不是函数加载
- 如何在主干中显示视图.js(路由器.js中不显示警报)
- 如何从主干中的视图呈现视图.js
- Extjs 4 -停止控制器试图加载视图js
- “this.model"不工作的点击视图.JS支柱
- MVC部分视图js文件不工作调试
- Rails3视图- JS模板目录结构