下面的代码为什么会为http://localhost:4200/page生成404状态代码却为http://localhost:4200生成200状态代码?
当Protractor运行时,我可以打开另一个浏览器窗口,然后在地址栏中键入http://localhost:4200/page,然后按Enter,它就可以工作。但是量角器中的request
给出了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
ng serve
并直接在您选择的浏览器中导航至http://localhost:4200/page,以查看页面是否存在npm install
,然后运行ng e2e
,以观察http://localhost:4200/page URL上的失败ng e2e
请注意,zip中包含Git历史记录。
答案 0 :(得分:0)
404来自缺少的Accept: text/html
标头。添加该标头,您将获得200。
就像DublinDev pointed out一样,它在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站点是在E2E测试期间由Angular的dev服务器托管的,而dev服务器显然具有此怪癖。