Как правильно написать app.get ()? (node.js / express / boby-parser) - PullRequest
0 голосов
/ 09 июля 2020

Я создаю сервер (node.js / express / boby-parser)

и мне нужно получить массив объектов users. его часть кода с сервера. js файл:

let users = [{
    name: 'user1',
}];

app.get('/users/', (req, res) => {
    const filePath = path.join(pth.dir, 'build', 'index.html');
    res.json(users);
    res.sendFile(filePath);
});

Это мой код из внешнего интерфейса:

const handleResponse = (response) => {
    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;
    });
};

const getAll = (baseUrl) =>  {
    const requestOptions = {
        method: 'GET'
    };
    return fetch(baseUrl, requestOptions).then(handleResponse);
};

Что-то не так с моим кодом на сервере. (Я просто не знаю, как использовать сервер express). когда я использую функцию getAll, я получил JSON текст вместо моей страницы. Кто-нибудь может помочь? Как мне написать app.get () на сервере. js. Или мне нужно написать в серверной части один app.get () для получения страницы или другой app.get () для получения JSON данных?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Почему вы пытаетесь отправить файл в ответе?:

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 для заполнения шаблона страницы и возврата всей страницы с данными. Для этого вам нужно будет использовать (или построить) какой-то механизм шаблонов в коде на стороне сервера, чтобы заполнить страницу перед ее возвратом.

1 голос
/ 09 июля 2020

res.json() представляет HTTP-ответ, который приложение Express отправляет, когда получает HTTP-запрос. С другой стороны, res.sendFile() передает файл по заданному пути.

В обоих случаях поток по существу передается клиенту, который мог сделать запрос.

Итак, нет, вы res.sendFile и res.json нельзя использовать вместе.

var options = {
    headers: {
        'name': 'user1',
    }
  };

res.sendFile(path.join(__dirname, 'build', 'index.html'), options);

Это действительно самое близкое, что вы можете сделать для достижения желаемой задачи.

...