捕获到的承诺中未处理的捕获错误-Node.js

时间:2020-02-09 16:19:47

标签: node.js express redis azure-redis-cache

我有一个从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");
        });

1 个答案:

答案 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)
}