如何分配返回数据对象,以便可以在视图中呈现(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;
这里有几件事要考虑:
- 您对服务器的请求是asynchronous的
- 你实际上并没有将数据返回到
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
模块时,数据可能还没有到达。 你可以在这里阅读关于asynchronous和同步的更多信息
我们如何解决这个问题? 我们传递方法一个callback
函数执行完成。
当我们执行模块…
data( function(data) { ...
…当它从服务器接收数据时,我们传递一个函数来运行。 如果服务器没有错误,并且状态码正常,那么…
if (!error && response.statusCode === 200) { ...
…然后我们调用已经传递的callback
函数,传递body
(或者数据,如果你喜欢的话)作为参数。
callback( body );
…我们可以在我们的index.js
使用这个…
res.render('index', { title: 'Express', data: data });