获取请求在测试模式下工作,但在生产模式下失败 - 谷歌应用引擎



我使用Cloud 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 应用程序部署"之后尝试并在生产中运行它时,其他获取请求工作正常,但是当"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 应用程序增加内存.js但错误仍然存在。

您包含的日志只是通用请求日志。我不确定 nodejs 环境是否也提供应用程序日志/详细信息,如果是这样,您如何访问它们。至少在python标准环境中,此类日志(可从开发者控制台读取Google App Engine上的应用程序日志中说明)通常包含错误消息或回溯,这对于识别实际问题非常有用。没有这些细节,这只是猜测,这就是我将在下面做的:)

可能是coinmarketcap交易所实际上并不支持fetchTicker,而你的代码假设所有交易所都支持它。ccxt手册中的一个例子实际上对此进行了检查:

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

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

更新:

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

  • 在标准环境中通过运行时和应用元素部分中的instance_class
  • 灵活环境中通过memory_gb在"资源设置"部分中

相关内容

  • 没有找到相关文章

最新更新