【问题标题】:Reusing values from asynchronous callback重用来自异步回调的值
【发布时间】:2017-05-15 09:21:13
【问题描述】:

所以我在 Node.js 和 express 中构建了一个应用程序,其中我有一个路由器和 API 模块,我从中发出 HTTP 请求。我正在努力解决在回调之间传递值的问题。

看起来像这样:

路由器:

var dataAPI = require('../API/getData');
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) { 
        dataAPI.getData(function(res, data){
                res.render('index', {data: data});
        });
});

module.exports = router;

而getAPI文件有这个功能:

var request = require('request');
var config = require('../config/config');

getData = function(callback){
    request({
        headers: {
            'Content-Type' : 'application/json',
            'Authorization' : config.authorization.token
        },
        uri: config.url.get_portfolio,
        method: 'GET',
        rejectUnauthorized: false,
    }, function(err, res, body){
        if (err || body == undefined ){
            console.log("Error in first callback.");
            throw err;
        } 
        console.log("HTTP: ", res.statusCode, " GOT DATA: ", body);
    });
}

我在这里想要完成的是能够做到

res.render('index', {data }) 

并使用 getData 函数中请求的数据。这样做的正确方法是什么?

【问题讨论】:

    标签: javascript node.js express asynchronous


    【解决方案1】:

    你在getData函数的请求中没有使用回调并且回调参数不正确 尝试这样做:

    var dataAPI = require('../API/getData.js')
    var express = require('express');
    var router = express.Router();
    
    router.get('/', function(req, res, next) { 
            dataAPI.getData(function(err,data){
                    if(err) throw err;
                    res.render('index', {data: data});
            });
    });
    

    //getData.js 文件

    var request = require('request');
    var config = require('../config/config');
    
    exports.getData = function(callback){
        request({
            headers: {
                'Content-Type' : 'application/json',
                'Authorization' : config.authorization.token
            },
            uri: config.url.get_portfolio,
            method: 'GET',
            rejectUnauthorized: false,
        }, function(err, res, body){
            if (err || body == undefined ){
                console.log("Error in first callback")
                callback(new Error("Error in first callback."),null) <----------
            }else{
                console.log("HTTP: ", res.statusCode, " GOT DATA: ", body);
                callback(null,body) <--------------
            }
        });
    }
    

    【讨论】:

    • 谢谢你,成功了。你的回答解释了我暂时无法理解的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    相关资源
    最近更新 更多