余烬服务和浏览器重新加载结果使用自定义 Ember.Location 进行"cannot GET /foo"。



TL;DR:将自定义位置类型添加到environment.js然后ember serve->打开浏览器路由/foo ->cannot GET /foo

按照 https://www.emberjs.com/api/classes/Ember.Location.html#toc_custom-implementation 中的说明进行操作,并将代码完全按照它显示的方式复制到名为app/locations/history-url-logging.js的文件中,在config/environment.js中添加了一行内容:

ENV.locationType = 'history-url-logging';

作为参考,文档中给出的代码很简单:

import Ember from 'ember';
export default Ember.HistoryLocation.extend({
implementation: 'history-url-logging',
pushState: function (path) {
console.log(path);
this._super.apply(this, arguments);
}
});

我决定重新启动服务器,按照通常的CTRL+Cember s然后再次ember s。我回到我的浏览器坐在其中一条路线上,点击F5,并收到神秘的错误:

Cannot GET /contacts

因此,经过大量的谷歌搜索和反复试验(并在此处发布我刚刚用您正在阅读的这篇文字编辑的上一个问题),我发现要修复该错误,我所要做的就是删除配置行ENV.locationType = 'history-url-logging';,重新启动服务器(ember s),突然应用程序运行良好!

更奇怪的是,如果我environment.js中启动没有该行的应用程序,那么一旦应用程序正在运行(并且浏览器窗口重新加载正常,等等),然后我重新添加显示ENV.locationType = 'history-url-logging';的行(触发实时重新加载),并且应用程序仍然可以正常工作!(例如,按 F5 重新加载页面不会让我遇到"无法获取/联系人"(或任何路由)错误。而且,当然,控制台按照上面的代码为我提供了"控制台.log"输出。

因此,无论长短,使用自定义位置似乎完全搞砸了ember serve- 这真的很可悲和令人沮丧!有什么想法可以解决这个问题吗?

Ember 内置服务器查看环境.js locationType 属性,以确定它是否必须在 rootURL 路径之后提供路由。默认情况下,如果位置类型为history它将执行此操作。它使用字符串匹配。

在您的情况下,您编写了自己的位置,从历史位置继承了环境中的 locationType 属性.js现在history-url-logging。内置服务器不会仅通过名称将其识别为基于历史记录的位置形式。它将默认为哈希位置。它不会分析您的代码。

对于此方案,我们必须帮助内置服务器了解 locationType 等效于历史记录位置。 您需要在环境中.js 位置类型属性后面添加historySupportMiddleware: true文件。

最新更新