Порядок этих двух строк не имеет значения, но res.send
не вызывается в случае, если client.set
идет первым, значит, есть ошибка.Если в функции async
возникает ошибка, это может привести к предупреждению UnhandledPromiseRejectionWarning
, которое будет отображаться в консоли.
Существует несколько проблем с этим фрагментом.
Ошибка возникает дажеесли хотя client.set
является асинхронным, то это означает, что client.set
вызывает синхронную ошибку, которая не была обнаружена.
client.set
не было обещано, но это должно происходить для правильного потока управления.Отсутствие аргумента обратного вызова может послужить причиной возникновения ошибки.
Как объяснено в в этом ответе , Express не поддерживает обещания, все отклонения должны быть явно обработаны.для правильной обработки ошибок.
Весь общий код, такой как require
, выходит за пределы функции промежуточного программного обеспечения.Это должно быть:
const redis = require('redis')
const redisURL = 'redis://127.0.0.1:6379';
const client = redis.createClient(redisURL);
const util = require('util')
client.get = util.promisify(client.get)
client.set = util.promisify(client.set)
app.get('/api/blogs', requireLogin, async (req, res, next) => {
try {
const cachedBlog = await client.get(req.user.id)
if (cachedBlog) {
return res.send(JSON.parse(cachedBlogs))
}
const blogs = await Blog.find({_user: req.user.id});
await client.set(req.user.id, JSON.stringify(blogs));
res.send(blogs);
} catch (err) {
next(err);
}
})
В большинстве популярных библиотек есть обещанные аналоги, позволяющие пропустить стандартный код обещания, это относится и к redis
.