Использование Async / Await с Мангуста - PullRequest
0 голосов
/ 13 ноября 2018

Я проходил этот продвинутый курс NodeJS от Стивена Гриндера, где мы тестировали кэширование в Redis.

Когда я запускаю свое приложение и достигаю заданного маршрута, меня выдает эта ошибка

Предупреждение об устаревании: Mongoose: mpromise (обещание по умолчанию для mongoose) библиотека) устарела, вместо нее подключите свою собственную библиотеку обещаний: http://mongoosejs.com/docs/promises.html

И еще один, который выглядит так

UnhandledPromiseRejectionWarning: необработанное отклонение обещания. это ошибка возникла либо при броске внутри асинхронной функции без блокировки, или отклонив обещание, которое не было обработано с .catch (). (идентификатор отклонения: 1) [0] (узел: 11896) [DEP0018] DeprecationWarning: Отклонения необработанных обещаний устарели В будущее, обещания отклонения, которые не обрабатываются, прекратят Процесс Node.js с ненулевым кодом выхода. [0] подача из MongoDb

Теперь, как уже упоминалось, я прошел и очень смутно посмотрел на него, и кажется, что их документация не говорит об асинхронности и ожидания.

Это маршрут API, который выдает ошибку

  app.get('/api/blogs', requireLogin, async (req, res) => {
    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)
    const cachedBlog = await client.get(req.user.id) 
    if (cachedBlog)  return res.send(JSON.parse(cachedBlogs))
    console.log("serving from MongoDb")
    const blogs = await Blog.find({_user: req.user.id})
    client.set(req.user.id, JSON.parse(blogs))
    res.send(blogs);
  });

Конкретнее здесь эта строка

 const blogs = await Blog.find({_user: req.user.id})

Где

const Blog = mongoose.model('Blog');

Примечание. Чтобы объяснить кеш в двух словах, Стивен Гриндер специально установил его в корне.

[Вопрос:] Может кто-нибудь сказать, пожалуйста, как я могу использовать async / await (как то, что я сейчас делал внутри маршрута) без каких-либо ошибок?

1 Ответ

0 голосов
/ 13 ноября 2018

Здесь есть две проблемы.

1: Вы не установили Обещания для Mongoose.Поэтому установите его.

mongoose.Promise = global.Promise

2: Когда вы используете async / await, вам нужно заключить код в блок try / catch.

try { 

   // your code

} catch(e) {

  console.log(e);

}

В вашем случае код должен выглядетькак.

app.get('/api/blogs', requireLogin, async (req, res) => {
   try {
      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)
      const cachedBlog = await client.get(req.user.id) 
      if (cachedBlog)  return res.send(JSON.parse(cachedBlogs))
      console.log("serving from MongoDb")
      const blogs = await Blog.find({_user: req.user.id})
      client.set(req.user.id, JSON.parse(blogs))
      res.send(blogs);
  } catch(e) {
      console.log(e);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...