我有一个从mongodb或azure redis缓存中获取数据的功能。我试图将其设置为首先检查缓存的位置,然后在缓存为空的情况下访问mongodb,但是由于某种原因,它首先执行了mongodb代码。我创建了一个承诺来处理订单,但这给了我一个未处理的承诺拒绝错误。我有一个问题,所以我不明白问题是什么。感谢您的帮助!
控制台输出
SETTING TRUE...
(node:27068) UnhandledPromiseRejectionWarning: Cache found
(node:27068) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise
which was not handled with .catch(). (rejection id: 1)
(node:27068) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero
exit code.
获取请求
const promise = new Promise((resolve, reject) => {
client.get("directory", (err, reply) => {
if (reply !== null) {
console.log("SETTING TRUE...");
redisReply = true;
replyConverted = JSON.parse(reply);
res.status(200).json({
message: "Directory retrieved successfully!",
posts: replyConverted,
maxPosts: replyConverted
});
reject("Cache found);
} else {
resolve();
}
});
}).then(res => {
const postPerPage = 20;
console.log("directory ID SECTION");
var searchKey = new RegExp(req.query.keyword, "i");
console.log("req.query.currentPage");
console.log(req.query.currentPage);
console.log(req.query.keyword);
let currentPage = req.query.currentPage;
console.log("REDIS RELY IS " + redisReply);
console.log("GRABBING FROM COSMOSDB");
User.countDocuments({
$and: [{ username: searchKey }, { role: "Seller" }]
})
.then(docs => {
console.log("COUNT");
console.log(docs);
let totalPosts = docs;
User.find({
$and: [{ username: searchKey }, { role: "Seller" }]
})
.select("_id username")
.skip(postPerPage * (currentPage - 1))
.limit(postPerPage)
.then(documents => {
res.status(200).json({
message: "Directory retrieved successfully!",
posts: documents,
maxPosts: totalPosts
});
let docsString = JSON.stringify(docs);
client.set("directory", docsString, (err, reply) => {
console.log(reply);
});
});
})
.catch(err => {
console.log("Skipped Mongodb");
});
答案 0 :(得分:1)
您可以创建一个函数,如果找到该缓存,则首先搜索该缓存;如果未进行查询,则使用它,然后对结果进行回调。在您的情况下,它可能看起来像这样,您可能还想使键动态以与查询相对应
module.exports.findDirectory = function(client,query, callback){
client.get(query, (err, reply) => {
if (err) {
callback(null);
} else if(reply){
callback(JSON.parse(reply));
} else {
User.countDocuments({
$and: [{ username: query.searchKey }, { role: "Seller" }]
})
.then(docs => {
console.log("COUNT");
console.log(docs);
let totalPosts = docs;
let postsPerPage = 9;
User.find({
$and: [{ username: query.searchKey }, { role: "Seller" }]
})
.select("_id username")
.skip(postPerPage * (query.currentPage - 1))
.limit(postPerPage)
.then(documents => {
let docsString = JSON.stringify(docs);
client.set(query, docsString, (err, reply) => {
console.log(reply);
callback(docs)
});
});
}
})
}
然后在这样的路线中使用它
dirsController.findDirectory(client,req.query,function(dirs){
res.send(dirs)
}