nodejs中的此方法返回一个未定义的对象

问题描述 投票:0回答:1

我之前问过这个问题,并且它与这个问题(How do I return the response from an asynchronous call?)相关联,但不能解决我的问题

我是node.js的新手,并且遇到一些我无法处理的错误或无法理解的任何帮助。我使用express-generator初始化应用程序。我正在尝试通过api调用向前端发送对象。我写了一个带有函数makeApiCall()的类“ StockClass.js”,该函数进行调用并返回对象。但是,当我在路由器中调用该功能时,我会得到“未定义”。继承人代码

//==== StockClass.js ===

const yahooFinance = require("yahoo-finance");
class stockClass {
    static makeApiCall(symbol) {
        yahooFinance.quote(
            {
                symbols: [symbol],
                modules: ["price", "summaryDetail"],
            },
            function (err, quotes) {
                if (err) { console.log(err) }
                console.log(quotes)
                return quotes;
            }
        );
    }
}

module.exports = stockClass;

//=====index.js======

const StockClass = require("../handlers/StockClass");

router.get("/new", function (req, res) {

   let quotes = StockClass.makeApiCall("AAPL");
   console.log(quotes);
   res.render('path', { quotes });
});

StockClass.js中的console.log正确记录了对象(引用),而index.js中的console.log记录了“未定义”。

下面的链接介绍了yahoo-finance api调用。 https://www.npmjs.com/package/yahoo-finance

================================================ =========================

我也尝试使用中间件并将数据附加到响应对象上,如下所示:>

//==========middleware=========

const yahooFinance = require("yahoo-finance");

module.exports = {

    makeApiCall: (symbol) => {
        return function (req, res, next) {
            yahooFinance.quote(
                {
                    symbols: [symbol],
                    modules: ["price", "summaryDetail"],
                },
                function (err, quotes) {
                    if (err) { console.log(err) }
                    res.stockObj = quotes;
                    console.log(res.stockObj);
                }
            );
            next();
        }
    }
}

//======= index.js =========
const handler = require("./handlers/stockUtils");

    router.get("/new", handler.makeApiCall("AAPL"), function (req, res) {

       let quotes = res.stockObj;
       console.log(quotes);
       res.render('path', { quotes });
    });

结果是一样的。中间件函数中的console.log记录正确的对象,但index.js中的console.log记录未定义

我早先问过这个问题,它与此问题相关联(我如何从异步调用中返回响应?)但是它不能解决我的问题,我对node.js还是很陌生,我...

javascript node.js
1个回答
0
投票

[这是异步编程(非阻塞)的经典案例,来自同步编程背景(例如pythonjavac等),我也面临着理解javascript中代码流的问题]。我花了一段时间,但是一旦掌握了javascript语言的行为方式,您将能够看到JS引擎如何解释代码以及如何执行代码。以下是一些可能会有用的链接:

© www.soinside.com 2019 - 2024. All rights reserved.