如何分配返回数据对象,以便可以在视图中呈现(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; 

这里有几件事要考虑:

  1. 您对服务器的请求是asynchronous的
  2. 你实际上并没有将数据返回到module.exports
  3. 代码中的一些基本的语法错误

尝试这个:

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 });