对猫鼬使用异步/等待

时间:2018-11-12 22:53:51

标签: javascript node.js mongodb asynchronous promise

我正在学习Stephen Grinder的高级NodeJS课程,我们在Redis中测试了缓存。

运行我的应用程序并到达给定的路线时,我被抛出此错误

  

弃用警告:猫鼬:mpromise(猫鼬的默认诺言   库)已弃用,请插入您自己的Promise库:   http://mongoosejs.com/docs/promises.html

还有另一个看起来像这样

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个   由抛出异步函数引起的错误   没有障碍,或者拒绝了没有处理的承诺   使用.catch()。 (拒绝ID: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');

注意:为了简要说明缓存,Stephen Grinder特意将其设置在根目录内。

[问题:] ?有人可以告诉我如何使用异步/等待(例如我当前在路由内所做的操作)而不会引发任何错误吗?

1 个答案:

答案 0 :(得分:4)

这里有两个问题。

1:您没有设置猫鼬的承诺。如此设置。

mongoose.Promise = global.Promise

2:使用异步/等待时,需要将代码包装在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);
  }
});