当前位置: 首页 > 知识库问答 >
问题:

为什么函数在返回语句后继续运行?

乜胜泫
2023-03-14

我正在运行以下代码,试图删除不存在的“尖叫”:

// Delete a scream
exports.deleteScream = (req, res) => {
  const document = db.doc(`/screams/${req.params.screamId}`);
  document.get()
    .then(doc => {
      if(!doc.exists){
        console.log("1")
        return res.status(404).json({ error: 'Scream not found'});
        console.log("2")
      }
      if(doc.data.userHandle !== req.user.handle){
        return res.status(403).json({ error: 'Unathorized'});
      } else {
        return document.delete();
      }
    })
    .then(() => {
      console.log("3")
      return res.json({ message: 'Scream deleted successfully'});
      console.log("4")
    })
    .catch(err => {
      console.error(err);
      console.log("5")
      return res.status(500).json({ error: err.code });
    });
};

控制台日志显示以下内容:

>  1
>  3
>  Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
>      at ServerResponse.setHeader (_http_outgoing.js:516:11)
>      at ServerResponse.header (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:771:10)
>      at ServerResponse.send (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:170:12)
>      at ServerResponse.json (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:267:15)
>      at /Users/sm/projects/socialape/functions/handlers/screams.js:227:18
>      at processTicksAndRejections (internal/process/task_queues.js:93:5) {
>    code: 'ERR_HTTP_HEADERS_SENT'
>  }
>  5
>  (node:4032) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
>      at ServerResponse.setHeader (_http_outgoing.js:516:11)
>      at ServerResponse.header (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:771:10)
>      at ServerResponse.send (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:170:12)
>      at ServerResponse.json (/Users/sm/projects/socialape/functions/node_modules/express/lib/response.js:267:15)
>      at /Users/sm/projects/socialape/functions/handlers/screams.js:233:30
>      at processTicksAndRejections (internal/process/task_queues.js:93:5)
>  (node:4032) 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:4032) [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.

我希望函数在404响应时停止执行,但似乎块都是在catchblock之外执行的。为什么会这样?

共有1个答案

陈知
2023-03-14

如果在< code>then函数中返回,则只返回那个< code >匿名函数。它不是从父节点返回的。您应该抛出一个< code >异常并在catch中返回。

const document = db.doc(`/screams/${req.params.screamId}`);
document
  .get()
  .then(doc => {
    if (!doc.exists) throw new Error(404);
    return doc;
  })
  .then(doc => {
    if (doc.data.userHandle !== req.user.handle) {
      throw new Error(403);
    } else {
      document.delete();
    }
    return doc;
  })
  .then(() => {
    res.json({ message: "Scream deleted successfully" });
  })
  .catch(error => {
    switch (error.message) {
      case 403:
        res.status(error.message).send({ error: "Unathorized" });
        break;
      case 404:
        res.status(error.message).send({ error: "Scream not found" });
        break;
      default:
        res.status(error.message).send({ error: error.message });
        break;
    }
  });
 类似资料:
  • 问题内容: 我编写了一个打印表格的程序。我没有在主函数中包含返回语法,但是无论何时我键入echo $?它显示12。 我的源代码: 我尚未编写return 12,但每次执行程序时它仍返回12。 谢谢。 问题答案: 正如swegi所说,这是未定义的行为。 正如史蒂夫·杰索普(Steve Jessop)等人所说,在C89之前,它是一个未指定的值,并在C99中指定(观察到的行为与C99不符)。 在大多数环

  • 我使用的是我的代码中有两个可观察的对象 观察值不是来自请求,而是来自 我需要根据这个逻辑将序列组合/转换成一个单一的可观察值: 如果序列,或,-需要返回新的可观察的否则需要返回 我试图使用来实现: 但问题是我的

  • 我还检查了调试,它将语句=>if(sum==1)返回true;但它也在执行更多的语句。

  • 在一些请求中,我们会做一些日志的推送、用户数据的统计等和返回给终端数据无关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。 这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。 怎么做到呢?我们先看其中的一种方法: local response

  • 问题内容: 我刚刚学习(正在学习)函数参数在Python中的工作方式,并且在没有明显原因的情况下开始进行实验: 给出了输出: 哪里来的?还有,这是什么? 问题答案: 它是函数的返回值,您可以将其打印出来。如果没有语句(或者只是没有参数的),则将隐式添加到函数的末尾。 您可能想返回函数中的值,而不是打印它们:

  • 问题内容: 目前,我正在努力学习Python,而在递归函数方面却陷入了停滞。在Think Python中 ,练习之一是编写一个函数,该函数使用以下定义来确定 a 是否为 b 的幂: “如果a被b整除,则a是b的幂,而a / b是b的幂。编写一个名为is_power的函数,该函数接受参数a和b,如果a是b的幂,则返回True。” 我函数的当前状态是: 实际上,这产生了我期望的结果。但是,本章着重于编