使用Async / await和mongoose

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Async / await和mongoose相关的知识,希望对你有一定的参考价值。

我正在接受Stephen Grinder的这个先进的NodeJS课程,我们正在测试Redis中的缓存。

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

弃用警告:Mongoose:mpromise(mongoose的默认承诺库)已被弃用,请插入您自己的promise库:http://mongoosejs.com/docs/promises.html

和其他看起来像这样的人

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误源于在没有catch块的情况下抛出异步函数,或者拒绝未使用.catch()处理的promise。 (拒绝ID:1)[0](节点: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:你没有为Mongoose设置Promises。所以设定它。

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

以上是关于使用Async / await和mongoose的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongoose 中使用 async/await

将 Async/await 与 mongoose 一起使用

在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入

ModeMongoose 的 Async/Await 与 Mongoose Deep Populate Chain

Promise/async-await with mongoose,返回空数组

async/await 在全局范围内显示数据