承诺中未处理的捕获错误已捕获 - Nodejs

unhandled catch error in promise that has catch - Nodejs

我有一个函数可以从 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.

GET 请求



  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");
        });

你可以做一个函数,如果找到就先搜索缓存,如果没有查询就使用它,然后对结果进行回调。在您的情况下,它可能看起来像这样您也可能希望使密钥动态化以与您的查询相对应

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