对猫鼬使用异步/等待

iRo*_*tia 1 javascript asynchronous mongodb node.js promise

我正在上斯蒂芬·格林德(Stephen Grinder)的高级NodeJS课程,我们在Redis中测试了缓存。

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

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

另一个看起来像这样

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.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);
  });
Run Code Online (Sandbox Code Playgroud)

具体来说这行

 const blogs = await Blog.find({_user: req.user.id})
Run Code Online (Sandbox Code Playgroud)

哪里

const Blog = mongoose.model('Blog');
Run Code Online (Sandbox Code Playgroud)

注意:为了简略地解释缓存,Stephen Grinder特意将其设置在根目录内。

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

Abh*_*ngh 5

这里有两个问题。

1:您没有设置对猫鼬的承诺。所以设置它。

mongoose.Promise = global.Promise
Run Code Online (Sandbox Code Playgroud)

2:当您使用异步/等待时,则需要将代码包装在try / catch块中。

try { 

   // your code

} catch(e) {

  console.log(e);

}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,代码应如下所示。

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);
  }
});
Run Code Online (Sandbox Code Playgroud)