Если вам интересно, есть ли способ достичь этого без else
, да, это так.
Но, это может быть не самым чистым способом. ИМО, использование return
- лучший способ остановить выполнение контроллера.
В любом случае, вы можете разделить фрагмент кода на промежуточное ПО и использовать троичный оператор для условной отправки ответов.
В вашем примере выделите data = await someGraphQLCall();
следующим образом:
const middlewareOne = async function(req, res, next) {
let data = [];
let response = { message: "No data." };
try {
data = await someGraphQLCall();
req.locals.data = data; // <- attach the data to req.locals
} catch (err) {
response = { err };
}
data.length === 0 ? res.json(response) : next();
};
А затем смонтируйте middlewareOne
ДО вашего контроллера:
app.get("/matches", middlewareOne, async function controller(req, res) {
try {
const someOtherData = await someOtherGraphQLCall(req.locals.data.foo);
res.json({ someOtherData });
} catch (err) {
res.json({ err });
}
});
Как это работает, функция controller
будет выполняться только экспрессом, если next()
вызывается из предыдущего промежуточного программного обеспечения - middlewareOne
в примере.
И поскольку middlewareOne
только вызывает next()
, если data.length
не равен 0, он будет работать так, как вы ожидали.
Для получения дополнительной информации о передаче данных из одного промежуточного программного обеспечения в другое читайте this