То, что я хочу сделать, это (с помощью модулей экспресс, 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