404 в транспортире для известных рабочих некорневых угловых страниц - PullRequest
1 голос
/ 20 июня 2019

Почему следующий код выдает код состояния 404 для http://localhost:4200/page, а код состояния 200 для http://localhost:4200?

Когда Protractor работает, я могу открыть другое окно браузера ивведите http://localhost:4200/page в адресную строку, нажмите Enter, и все работает.Но request в Protractor дает 404.

import * as Request from 'request';
describe('Link', () => {
  it('should work', async () => {
    const href = 'http://localhost:4200'; // works
    // const href = 'http://localhost:4200/page'; // doesn't work, even though this works outside of Protractor while Protractor is running
    const statusCode = await new Promise<number>((resolve, reject) => {
      Request(href, (error, response, body) => {
        if (error) {
          reject(error);
        } else {
          resolve(response.statusCode);
        }
      });
    });
    if (typeof(statusCode) !== 'number') {
      throw new Error(`Failed to request ${href}`);
    }
    if (statusCode < 200 || statusCode >= 300) {
      throw new Error(`Bad status code ${statusCode} for ${href}`);
    }
  });
});

Вот полное, минимальное, проверяемое воспроизведение: https://drive.google.com/uc?export=download&id=1S2It1jA1bTR1hUoqdd_QC_Qa6BB3wnDS

  1. Запустите ng serve и перейдите к http://localhost:4200/page непосредственно в выбранном вами браузере для просмотра страницы существует
  2. Запустите npm install, а затем ng e2e, чтобы увидеть ошибку при http://localhost:4200/page URL
  3. Изменить тест E2Eотложить на долгое время, чтобы вы могли сделать это:
    1. ng e2e
    2. Пока Protractor все еще выполняет тест с длительной задержкой, перейдите к http://localhost:4200/page прямо в браузеречтобы проверить, существует ли страница во время работы Protractor

Обратите внимание, что история Git включена в zip.

1 Ответ

0 голосов
/ 21 июня 2019

404 из отсутствующего Accept: text/html заголовка. Добавьте этот заголовок, и вы получите 200.

Как отметил DublinDev , он также не работает в Postman, так что это не проблема request. Но это работает в Chrome. Это пахнет проблемой заголовков. Конечно же, после того, как я немного поигрался с заголовками, я сузил его до этого.

Вот конечный продукт:

const statusCode = await new Promise<number>((resolve, reject) => {
  Request({
    url: href,
    headers: {
      'Accept': 'text/html'
    }
  }, (error, response, body) => {
    if (error) {
      reject(error);
    } else {
      resolve(response.statusCode);
    }
  });
});

Итак, подведем итог: этот заголовок необходим, поскольку сайт Angular размещается на сервере dev Angular во время тестов E2E, и сервер dev, по-видимому, имеет эту причуду.

...