Почему вы пытаетесь отправить файл в ответе?:
res.sendFile(filePath);
Для начала, содержимое ответа может быть JSON или файлом (или любым из множество других вещей, конечно), но не то и другое одновременно. С такими данными, как JSON или XML, можно объединить несколько объектов в один более крупный объект для одного ответа, но это не сработает, если типы содержимого полностью отличаются, как в случае с файлом.
Глядя на свой клиентский код, вы даже ничего не делаете с этим файлом. Вы читаете только данные JSON:
return response.text().then(text => {
const data = text && JSON.parse(text);
if (!response.ok) {
const error = (data && data.message) || response.statusText;
return Promise.reject(error);
}
return data;
});
Таким образом, самый простой подход здесь - просто не пытаться отправить обратно файл:
app.get('/users/', (req, res) => {
res.json(users);
});
Изменить: Судя по комментариям ниже, вы, похоже, боретесь с различными запросами, которые клиент делает к серверу. Браузер, загружающий страницу, представляет собой один запрос с одним ответом. Если эта страница включает JavaScript, который должен получить данные, это будет отдельный запрос AJAX с собственным ответом, содержащим только эти данные.
Можно использовать сервер JSON (или любые данные) -side для заполнения шаблона страницы и возврата всей страницы с данными. Для этого вам нужно будет использовать (или построить) какой-то механизм шаблонов в коде на стороне сервера, чтобы заполнить страницу перед ее возвратом.