如何分配返回数据对象,以便可以在视图中呈现(node.js)

时间:2015-09-29 13:00:44

标签: javascript json 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 个答案:

答案 0 :(得分:1)

这里有几点需要考虑:

  1. 您对服务器的请求是异步
  2. 您实际上并未将数据返回module.exports
  3. 代码中的一些基本语法错误
  4. 试试这个:

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