我参加了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:你没有为猫鼬设定承诺。那就设置吧。
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);
}
});