使用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的主要内容,如果未能解决你的问题,请参考以下文章
在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入
ModeMongoose 的 Async/Await 与 Mongoose Deep Populate Chain