获取请求在测试模式下工作但在生产模式下失败 - 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 环境:
- 在标准环境中通过 Runtime and app elements 部分中的
instance_class
- 通过 Resource settings 部分中的
memory_gb
在灵活的环境中
我使用云 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 环境:
- 在标准环境中通过 Runtime and app elements 部分中的
instance_class
- 通过 Resource settings 部分中的
memory_gb
在灵活的环境中