我正在学习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特意将其设置在根目录内。
[问题:] ?有人可以告诉我如何使用异步/等待(例如我当前在路由内所做的操作)而不会引发任何错误吗?
答案 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);
}
});