【发布时间】:2020-12-23 04:37:05
【问题描述】:
我有一个部署到 Google App Engine 的 nodejs10 应用程序。如果用户之前在 Chrome 中使用过该应用程序,则重新部署该应用程序时该应用程序将无法运行。该应用程序是使用 create-react-app 创建并使用 webpack 构建的,因此 css 和 js 在构建时被重命名,但引用这些文件的 index.html 不是。因此,当用户在部署后访问该站点时,它将获得引用不再存在的 js/css-files 的缓存 index.html。这反过来又导致Uncaught syntax error: unexpected token '<'
我发现让应用程序再次运行的唯一方法是打开检查器,禁用缓存并重新加载页面。不用说,这不是您可以要求最终用户做的事情。
我已经为此搜索了解决方案,并发现了类似的问题但不完全相同,或者如果它们相同,则没有可用的解决方案。
当没有对现有静态文件发出请求以使 React 路由器正常工作时,express 代码为 index.html 提供 res.sendFile:
app.get('*', (req,res) =>{
try {
res.sendFile(path.join(public+'/index.html'))
} catch(e) {
res.status(404).send()
}
});
问题是我最近将应用程序从个人谷歌云帐户转移到了我的企业帐户,我以前从未遇到过这个问题。所以要么我改变了一些东西来导致这个,要么App Engine已经改变了。
响应标头(响应代码 304)如下所示:
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Content-Encoding: gzip
Content-Length: 1200
Content-Type: text/html; charset=UTF-8
Date: Thu, 03 Sep 2020 20:43:51 GMT
ETag: W/"967-49773873e8"
Last-Modified: Tue, 01 Jan 1980 00:00:01 GMT
Server: Google Frontend
Vary: Accept-Encoding
X-Cloud-Trace-Context: 7f98678c2ba7dc90ad204b67bec766df;o=1
X-Powered-By: Express
因此,您可以看到文件上的“最后修改”日期是 1980 年 1 月 1 日。我已经验证该文件实际上在应用引擎上具有最后修改日期。但是在部署的本地构建文件夹中,该文件具有当前日期。不知道这是否是导致问题的原因。
所以我有点迷路了。我想我可以破解“最后修改”的标题,但这并不像是一个好的解决方案。而且我也担心同样的行为可能会发生在其他文件上,这会导致类似的问题。还有其他人遇到这个并提出了解决方案吗?
【问题讨论】:
-
确实,如果这是缓存引起的问题,您将无法解决它,因为无法清除客户端浏览器缓存。搜索此类错误,我发现它可能与您的应用程序的路由系统和
app.yaml配置有关。考虑到这一点,您能否看看这个类似的案例here 并检查这两个配置中的更改是否有助于您解决您的案例? -
@gso_gabriel 虽然链接的问题给出了相同的错误消息,但它不是同一个问题。就我而言,如果我清除浏览器缓存,一切正常。我知道可能无法清除客户端缓存,但至少我可以阻止为将来的版本缓存文件。在我部署的代码中,提供 css/js 文件没有问题,只是缓存的 index.html 尝试访问错误的文件,因为它们在重建时更改了名称。
-
嗨@ChristofferHallqvist 我已经发布了一个答案,为删除缓存提供可能的解决方案,这可能会对您有所帮助。如果它对您有帮助,请考虑支持/接受它。 :)
标签: node.js reactjs express google-app-engine create-react-app