Node.js memcached 从 try/catch 中抛出未处理的承诺拒绝

时间:2021-01-15 20:04:58

标签: node.js promise memcached amazon-elasticache node-promisify

我正在使用 node.js memcached 库的promisified 版本进行缓存。

    var get = promisify(memcached.get).bind(memcached);
    var set = promisify(memcached.set).bind(memcached);
    var add = promisify(memcached.add).bind(memcached);
    var del = promisify(memcached.del).bind(memcached);
    var incr = promisify(memcached.incr).bind(memcached);
    var getMulti = promisify(memcached.getMulti).bind(memcached);

这些在我的 connections.js 文件的导出中公开。我认为这已经足够了,因为我预计如果 memcached 出现任何问题,它会默默地失败,我可以回退到数据库。

每小时一两次(我猜应用程序每小时收到大约 30,000 个请求)请求失败,日志输出如下:

(node:28788) UnhandledPromiseRejectionWarning: Error: Item is not stored
at Socket.notstored (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:445:20)
at Client.rawDataReceived (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:744:51)
at Client.BufferBuffer (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:678:12)
at Socket.bowlofcurry (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\utils.js:126:15)

这对我来说似乎很奇怪,但我认为我可以通过将我的函数包装在 try/catch 中来解释这种可能性。

        incr: async function (key, amount) {
            key = Buffer.from(key).toString('base64')
            try {
                if (amount == undefined) {
                    amount = 1
                }
                var value = await get(env + key);
                if (!value) {
                    await set(env + key, amount, 0)
                } else {
                    await incr(env + key, amount);
                }
                return get(env + key)
            } catch (e) {
                console.log("Memcached incr error: " + e);
                return 1
            }
        }

当我调试并连接到 memcached 服务器时,我发现在调用 cache.incr() 时发生了同样的错误。异常没有被捕获,只是请求失败并向客户端发送了 500。

我错过了什么? promisify 不处理深度异常吗?日志永远无法将异常一直追溯到我代码中的函数调用;它只是在 memcached 库中的 utils.js 处停止。为什么那里断开连接?

0 个答案:

没有答案