Как дождаться операции redis и отловить ошибку в node.js? - PullRequest
0 голосов
/ 30 марта 2019

То, что я хочу сделать, это (с помощью модулей экспресс, redis):

router.post('/', async (req, res, next) => {
    try {
        await client.set('key', value)
    } catch (err) {
        return next(err)
    }

    // should not be reached here if an error occured.
})

То есть я хочу отловить ошибку и вернуться, чтобы остальная часть кода не могла быть выполнена. Я пробовал promisifyAll, используя bluebird и client.setAsync, но catch не сработал.


[редактировать]

Я намеренно использовал неверный URL для соединения. Итак, ошибка должна произойти. Если я передам обратный вызов функции client.set в качестве третьего параметра, я смогу увидеть журналы ошибок:

Error: Redis connection to asdf:6379 failed - connect ETIMEDOUT 216.157.88.27:6379

Но я не могу await таким образом.

К счастью, я обнаружил, что util.promisify хорошо работает так:

const client = redis.createClient()
const setAsync = util.promisify(redisClient.set.bind(redisClient))
...
    try {
        await setAsync('key', value)
    }
...

Я не знаю, почему синяя птица не работала. Что я сделал, это:

bluebird.promisifyAll(redis)
const client = redis.createClient()
...
    try {
        await client.setAsync('key', value)
    }
...

Я ссылался на этот документ https://github.com/NodeRedis/node_redis#bluebird-promises

...