我有以下代码,我基本上向我的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;
答案 0 :(得分:1)
这里有几点需要考虑:
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
模块时,数据可能尚未到达。您可以阅读有关异步与同步here的更多信息。
我们如何解决这个问题?我们将方法传递给callback
函数,以便在完成时执行。
当我们执行模块......
data( function(data) { ...
...我们正在传递一个函数,当它从服务器接收数据时运行。如果服务器没有错误且statusCode
正常......
if (!error && response.statusCode === 200) { ...
...然后我们调用传递的callback
函数,传递body
(或数据,如果你愿意)作为参数...
callback( body );
...我们可以在index.js
...
res.render('index', { title: 'Express', data: data });