获取请求在测试模式下工作但在生产模式下失败 - Google App Engine

Get request is working in testing mode but fails in production - Google App Engine

我使用云 shell 和 Google 应用引擎的编辑器创建了自己的 API。这是在测试中运行良好的代码片段:

app.get('/fetch_ticker', (req, res) => {
    (async() => {
        let pair = req.param('pair', "BTC/ETH");
        let ex = req.param('exchange', "coinmarketcap");
        let myArr = [];
        let exchange = await new ccxt[ex]();
        let tickers = await exchange.fetchTicker(pair);

        myArr.push(tickers);

        //Send req
        res.status(200).send(myArr);
    })()
});

现在,当我在生产环境中 'Gcloud app deploy' 和 运行 之后尝试它时,其他 get 请求工作正常,但是当 'ex' 等于 'coinmarketcap' 时,它只是不断加载,最后给出 500 错误。

更新:

这是日志:

2018-11-03 11:43:50 default[20181103t163752]  ==== JS stack trace =========================================
2018-11-03 11:43:50 default[20181103t163752]
2018-11-03 11:43:50 default[20181103t163752]  Security context: 0x3e6826325879 <JSObject>
2018-11-03 11:43:50 default[20181103t163752]      1: indexBy(aka indexBy) [/srv/node_modules/ccxt/js/base/functions/generic.js:~82] [pc=0x30a50d2a5374](this=0x32f
9351022d1 <undefined>,/* anonymous */=0x1e7ccf12dc59 <JSArray[37746]>,/* anonymous */=0x32f935144e51 <String[2]: id>,/* anonymous */=0x32f9351022d1 <undefined>)
2018-11-03 11:43:50 default[20181103t163752]      2: arguments adaptor frame: 2->3
2018-11-03 11:43:50 default[20181103t163752]      3: set_markets(aka setMarkets) [/srv/node_modules/ccxt/js/base/Exchange.js:613] ...
2018-11-03 11:43:50 default[20181103t163752]
2018-11-03 11:43:50 default[20181103t163752]  FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
2018-11-03 11:43:50 default[20181103t163752]   1: node::Abort() [node]

我尝试使用节点 --max_old_space_size=4096 app.js 增加内存,但错误仍然存​​在。

您包含的日志只是一般请求日志。我不确定 nodejs 环境是否也提供 app logs/details,如果是,您如何获得它们。至少在 python 标准环境中,此类日志(可访问,如 所示)通常包含错误消息或回溯,对于识别实际问题非常有用。没有这些细节,这只是猜测,这就是我下面要做的:)

可能 coinmarketcap 交易所实际上并不支持 fetchTicker,而您的代码假定所有交易所都支持它。来自 the ccxt Manual 的示例实际上对此进行了检查:

// JavaScript
if (exchange.has['fetchTicker']) {
    console.log (await (exchange.fetchTicker ('BTC/USD'))) // ticker for BTC/USD

或者 coinmarketcap 交换服务器有某种(临时)中断。或者不再以与 ccxt 库预期的相同条件或相同格式提供数据,在这种情况下,我会将其替换为默认交换以用于行为正常的交换。

更新:

好的,错误日志表明内存分配问题。典型原因是应用实例内存不足。您可以通过 app.yaml 配置解决此问题,具体取决于您使用的 GAE 环境: