Node.js 允许客户端路由的服务器端响应

Node.js 允许客户端路由的服务器端响应,node.js,http,single-page-application,Node.js,Http,Single Page Application,我正在开发一个具有客户端路由器的单页应用程序。因此,尽管运行应用程序的基本url将是http://example.com或http://example.com/index.html,但会跳过路由“/”和“/index.html”的域名 但在我的应用程序中的某个地方,由于我的客户端路由器,我可能会调用类似“/appoints/20160113”的路由,客户端路由器会将我重定向到SPA中的相应“约会页面”,并传递todays date参数 但是如果用户直接调用,我会认为服务器应该直接用/index.

我正在开发一个具有客户端路由器的单页应用程序。因此,尽管运行应用程序的基本url将是http://example.com或http://example.com/index.html,但会跳过路由“/”和“/index.html”的域名

但在我的应用程序中的某个地方,由于我的客户端路由器,我可能会调用类似“/appoints/20160113”的路由,客户端路由器会将我重定向到SPA中的相应“约会页面”,并传递todays date参数

但是如果用户直接调用,我会认为服务器应该直接用/index.html响应,这样浏览器就不会得到404

我正在使用nodejs构建服务器(特别是http2模块,但我认为这并不重要,我的示例也不使用https,尽管它们使用http2)。我只是试着改变服务器,如果它被一个未知的url击中,它会用index.html文件响应

然而,浏览器将此视为其第一个响应,然后请求与url相关的其他附加文件(例如,使用/appoints/20160113/styles/main.css)。这将导致一个无限循环,因为服务器在index.html中响应另一个副本(并立即获得/appoints/20160113/styles/styles/main.css的请求)

在页面的生命周期中,javascript还不能运行(特别是路由器软件),因此显然这种方法过于简单

我还编写了客户端路由器(使用历史api),以便在需要时进行更改


应如何处理这种情况。我想也许301重定向到/index.html或其他什么,然后路由器的初始调度知道这一点,可以执行popstate或其他操作。理想情况下,我希望支持通过外部方式在用户之间传递URL,但直到我真正尝试实现它之前,我还没有意识到其中的含义。

我不知道这是否是最好的方法,但在这里没有得到任何答案,我决定尝试一些不同的方法,看看哪种方法效果最好

每种方法都涉及到301重定向到/index.html,然后通过不同的机制提供我重定向的url

这就是我试过的

  • 设置具有短过期日期(其值为url)的cookie
  • 使用url添加带有?redirect=参数的查询字符串
  • 在/index.html之后添加带有url的#片段
  • 最后我拒绝了1),因为chrome在我使用cookie之后没有删除cookie,而使cookie的值变短取决于客户端和服务器之间的准确时间。这个解决方案似乎太脆弱了

    我试了试,结果看起来不错,直到我来测试它。不幸的是,设置window.location.search会导致页面重新加载,我真的很难弄清楚到底发生了什么。然而,我在3)中发现的关于模拟的内容可以很好地提供给基于2)的解决方案,因此这是一个可以使用的解决方案。我仍然可能回到这个解决方案,因为它“感觉”对我来说是正确的

    我试过了,效果很好。但是,由于我的路由器元素在初始化过程中使用了#片段,因此我在测试中遇到了时间问题,但在测试套件中建立路由器之前,我无法设置window.location.hash。我想用sinon模拟window.location.hash,这样我就可以控制它了,但事实证明你做不到

    解决方案是路由器将自己对window.location.hash的调用封装在库中,这样我就可以模拟库了。这就是我最后所做的,一切都成功了

    我可以回到使用查询字符串并在库调用中包装window.location.search,这样我就可以存根该调用并避免重新加载页面的问题