在 Express 应用中有条件地发送响应

J. *_*ers 3 if-statement node.js express

我很好奇您是否可以if在 Express 应用程序中编写语句以在不提供else语句的情况下有条件地执行您的代码。

if(pred) {
  doSomething()
}
return foo;
calcBar(); // doesn't run.
Run Code Online (Sandbox Code Playgroud)

以上是return语句后停止执行的同步代码。

我的 Express 函数如下所示:

app.get('/matches', async function(req, res) {
  try {
    const data = await someGraphQLCall();
    if(data.length === 0) {
      res.json({ message: "No data." });
    }
    const someOtherData = await someOtherGraphQLCall(data.foo);
    res.json({ someOtherData });
  } catch (err) {
    res.json({err})
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道因为这个问题,第一个之后的代码res.json可能仍然会被执行。有没有办法阻止它?如果满足第一个 if 条件,我不希望执行第二个 GraphQL 调用。这可能不使用else吗?

编辑:

正如我上面提到的问题,使用return语句是一个糟糕的选择,因为:

它还使它变得不那么有意义和模糊,因为它使用了不正确的语义。如果您没有使用函数中的值,则不应返回一个值。

Ore*_*esz 6

您可以return在第一个响应上使用关键字以立即从函数返回。

app.get('/matches', async function(req, res) {
  try {
    const data = await someGraphQLCall();
    if(data.length === 0) {
      return res.json({ message: "No data." });
    }
    const someOtherData = await someOtherGraphQLCall(data.foo);
    res.json({ someOtherData });
  } catch (err) {
    res.json({err})
  }
} 
Run Code Online (Sandbox Code Playgroud)

编辑:

作为替代方案,您可以拆分数据逻辑并建立响应。这样你就可以使用 return 并且更容易阅读:

app.get('/matches', async function (req, res) {
    try {
        const data = await getDataFromGraphQLCall();
        res.json(data);
    } catch (err) {
        res.json({ err })
    }
});

async function getDataFromGraphQLCall() {
    const data = await someGraphQLCall();
    if (data.length === 0) {
        return { message: "No data." };
    }
    const someOtherData = await someOtherGraphQLCall(data.foo);
    return { someOtherData };
}
Run Code Online (Sandbox Code Playgroud)