提问者:小点点

在mongoose中使用Async/Await


我参加了Stephen Grinder的NodeJS高级课程,在那里我们测试了Redis中的缓存。

当我运行应用程序并到达给定的路由时,会出现以下错误

deprecationwarning:mongoose:mpromise(mongoose's默认的promise库)已被弃用,请插入您自己的promise库:http://mongoosejs.com/docs/promises.html

另一个是这样的

UnhandledPromiserEjectionWarning:未处理的承诺拒绝。此错误可能是由于不带catch块的异步函数内部引发的,或者是由于拒绝了未用。catch()处理的承诺。(拒绝ID:1)[0](Node:11896)[DEP0018]拒绝警告:未处理的承诺拒绝被拒绝。将来,没有处理的承诺拒绝将使用非零退出代码终止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特意将其设置在根中。

[问题:]有人能告诉我如何使用async/await(就像我当前在路由内部所做的那样)而不会被抛出任何错误吗?


共1个答案

匿名用户

这里有两个问题。

1:你没有为猫鼬设定承诺。那就设置吧。

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);
  }
});