【问题标题】:How to asynchronously export a JSON array after HTTP request in Node.js如何在 Node.js 中的 HTTP 请求后异步导出 JSON 数组
【发布时间】:2015-01-26 06:13:09
【问题描述】:

我遇到了异步导出变量的问题。我想访问另一个文件中的apiData。目前,出于明显的原因,我正在导出一个空数组。如何异步执行此操作并获取 JSON 数据?

    var express = require('express');
    var router = express.Router();
    var request = require('request');

    /* GET home page. */
    router.get('/', function(req, res) {
        res.render('index', { title: 'InstaExpress' });
    });

    var apiData = [];

    router.post('/apiData', function(req, res) {
        var latitude = req.body.latitude;
        var longitude = req.body.longitude;
        var galleryURL = 'http://mobile-test-api.influentialdev.com/stream' +
     '?' + 'lat=' + latitude + '&lng=' + longitude;
        var detailURL = 'http://mobile-test-api.influentialdev.com/stream/:id';

        request(galleryURL, function(error, response, body) {
            if(!error && response.statusCode == 200) {
                apiData = JSON.parse(body);
                res.json(apiData);
            }
        });
    });

    // I want the apiData to be exported after the asynchronous operation above:
    module.exports = {
        router: router,
        apiData: apiData
    };

【问题讨论】:

    标签: javascript node.js http express


    【解决方案1】:

    您不能在 node.js 中“异步导出”某些内容。你可以做的是导出一个接受回调的函数。然后,当您执行导出的函数时,将执行异步操作并将结果传递给用户提供的回调。

    【讨论】:

    • 有没有更好的方法可以在另一个文件中使用apiData 变量?目前,我通过表单 (POST /apiData) 中的提交操作从地理定位 API 获取纬度和经度,并将它们与 REST 端点一起使用以获取 JSON 数据。
    • 您可以做的是缓存该值,以便对导出函数的其他调用只需使用缓存的值调用回调(可能在下一个滴答),而不是发出另一个网络请求。跨度>
    • 我至少找到了解决问题的方法:我创建了一个单独的文件 apiJSON.js,其中包含一个空数组并将其导出:var data= []; module.exports = data;。然后我在上面的文件中包含了这个 apiJSON.js 模块,在 POST 请求回调中,我将 JSON 数组值推送到了这个 data 数组中。现在我在 data 数组中有 JSON 数据。
    • 您可以在没有额外文件的情况下执行相同的操作。但问题是您不知道 何时 导出的 apiJSON 值“准备好”被使用,特别是如果您执行 http 请求来填充它并最终得到一些导致导出的 apiJSON 值保持为空数组的错误(怎么会有人知道发生了错误并且不会填充该值?)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2010-09-12
    • 2017-10-19
    • 2018-10-31
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多