【问题标题】:How to assign return data object so it can be rendered in view (node.js)如何分配返回数据对象以便它可以在视图中呈现(node.js)
【发布时间】:2015-09-29 13:00:43
【问题描述】:

我有以下代码,我基本上是在向我的 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;

【问题讨论】:

    标签: javascript json node.js


    【解决方案1】:

    这里有几件事需要考虑:

    1. 您对服务器的请求是异步的
    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 模块时,数据可能尚未到达。您可以阅读有关异步与同步的更多信息here

    我们如何解决这个问题?我们向该方法传递一个callback 函数以在完成时执行。

    当我们执行模块时...

    data( function(data) { ...
    

    ...当它从服务器接收数据时,我们将传递给它一个运行的函数。如果服务器没有错误并且statusCode 正常...

    if (!error && response.statusCode === 200) { ...
    

    ...然后我们调用传递的callback 函数,将body(或数据,如果你喜欢)作为参数传递...

    callback( body );
    

    ...然后我们可以在我们的index.js...中使用它...

    res.render('index', { title: 'Express', data: data });
    

    【讨论】:

    • 我的应用程序在 `router.get('/', function(req, res, next) {` 上崩溃并抱怨语法错误
    • @SeongLee 抱歉,我忘记了一个角色。已更新答案。
    • 不确定是什么错字。我的应用仍然崩溃。
    • ..../routes/index.js:12 data: data ^^^^ SyntaxError: Unexpected identifier
    • @SeongLee 第 12 行有什么内容?你确定你需要我写的data.js 文件吗?
    猜你喜欢
    • 2021-06-13
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2021-04-20
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多