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

How to assign return data object so it can be rendered in view (node.js)

本文关键字:视图 js node 返回 何分配 分配 数据 对象      更新时间:2023-09-26

我有以下代码,我基本上向我的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. 你对服务器的请求是异步的
  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模块时,数据可能还没有到达。你可以在这里阅读更多关于异步和同步的内容。

我们如何解决这个问题?我们传递给该方法一个callback函数,当它完成时执行。

当我们执行模块时…

data( function(data) { ...

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

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

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

callback( body );

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

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