node.js和单页web应用程序

我正在看express.js的后端和JS在客户端。 我的应用程序是单个页面的Web应用程序。

服务器将只提供JSON消息,我的问题是关于“路由”expression。 是否应该使用路由来连接UI和服务器端业务逻辑? 这将如何与我的单页面应用程序?

所以可以说,客户端向服务器发出一个Ajax调用,在数据库中寻找一个值,并且有一个服务器端脚本将JSON提供给UI。 这个UI和节点脚本关系如何设置?

有人可以解释一下吗?

单页面应用程序是位于单个HTML文档上的应用程序。 这意味着如果你想向用户显示一些不同的内容,根据应用程序的状态,你需要做一些DOM操作(用不同的HTML截取和replace当前文档的某些元素),以便更新用户看到的“视图”。 对不起,如果这对你是显而易见的,请不要冒犯。 我想我会从这里开始。 和我一起去,我会解释你的路由情况将如何发挥(或多或less)。

URL由几个不同的部分组成,每个部分都通知浏览器一个特定的信息位,以便下载用户试图访问的资源。 通常情况下,您正在查找的资源是在某个服务器上closures的,浏览器知道这是因为URL中的部分内容像“协议”(“http:”)和“主机”(“www.mydomain.com”)它会去那个服务器find你要求的东西。 在URL中还有“查询”参数,这些参数为服务器提供了关于特定操作的一些附加信息,例如search查询的search条件。 在查询参数之后,出现“哈希”。 散列是单页应用程序的魔力发生的地方…呃,好吧,…..

首先一点关于哈希。 当您向URL添加“#”时,浏览器会将当前显示的文档中的某个位置(元素)之后的信息解释出来。 也就是说,如果你有一个“id”为“main”的元素,并且在URL的末尾添加了“#main”,如:http://www.example.com#main,浏览器将“滚动”(通常是“跳转”)到该元素的开头,以便您可以看到它。 但是,请注意,如果您键入“ http://www.example.com/#main ”(使用与斜线分隔的哈希值),那么您将强制完成一个页面重新加载,浏览器将尝试查找在服务器上的名称“#main”的文件(我敢打赌,它没有find它)。

这里要说的是,如果URL中有一个散列,那么浏览器将不会试图离开当前文档 ,当然这是上面提到的例外情况,这很好,因为单页面应用程序不希望离开页面或从服务器请求新的文档。 (请参阅单页应用程序的路由select不同吗?)

现在,关于散列的整个事情对于单页面应用程序来说并不重要,因为你可以做一个而不用处理这一切。 一堆点击处理程序和DOM操作是你真正需要的……但是,这意味着用户将无法共享链接到应用程序中的特定视图。 URL永远不会改变,我们将永远无法直接导航到任何特定的视图。 我们总是从您的应用程序的开始位置开始,这很可能是一个非常烦人的情况。

如果您的单页应用程序将具有不同的视图,并且您希望用户能够通过书签或链接直接导航到特定的应用程序,那么您将需要在前端实现一种路由forms您需要在后端实现路由(路由数据API等),这意味着您将需要使用哈希。

我不想了解不同的框架如何在前端完成路由,但是当用户点击一个链接时,更新浏览器的地址字段,并观察地址栏以确定当前URL是什么以及将与该URL关联的HTML加载到文档树中指定位置的DOM中。

因此,在一个单页面应用程序中,服务器上有一个处理呈现应用程序HTML文档(index.html)的path,并且您有负责处理应用程序数据的路由(在数据库,login和注销,编辑或销毁数据库中的实例,以及获取数据…),这些都是通过AJAX请求调用的。

这实际上是一个相当复杂的情况,因为HTML5允许我们能够放弃散列(借助于服务器上的一些链接重写),并且能够使用“后退”和“前进”button,实际上是从原始文档导航(我们并不是因为我们只指向浏览器到完全相同的URL,只有修改后的哈希值,所以没有发生新的页面加载)。 传统的网站导航和链接可以通过使用浏览器的历史API来实现,IE浏览器从版本10(我相信)开始就可以使用,其余的大型浏览器供应商已经提前发布了,因此,这项技术将允许您的用户浏览您的应用程序,而不需要URL中的散列。 解释这是一个转移,而不是理解在单页面应用程序的路由,但它是有趣的,你最终必须学习它,也许..

应该使用AJAX从服务器请求JSON。 AJAX请求将始终击中你的服务器,因为你没有在AJAX请求中包含哈希符号(这样做是荒谬的,因为哈希仅用于文档内浏览),所以服务器端路由必须负责公开你的数据API(考虑一个REST风格的)。 虽然这不是单页面应用程序的唯一目的,但它也许是最重要的一个。

Soooo,把它包起来,你将有两套路线。 一个在客户端(作为像AngularJS或EmberJS这样的客户端框架的一部分,名单继续下去…我更喜欢Angular,但是对于那个来说有一个相当陡峭的学习曲线),还有一个在服务器上。 当你想到“服务器路线”时,会想到数据API。 当你想到“页面路由”的时候,记住这一切都是在客户端处理的,通过初始服务器响应提供的javascript(这是向浏览器呈现HTML所涉及的唯一必要的服务器端路由,加载你的'index.html'和所有必要的脚本和样式表等)。 您将使用express.static中间件来提供静态文件,所以您不必担心为这些东西分配路由。

编辑快速提到的AJAX实现。 在服务器上,您将拥有与Alex提供的路由相似的路由,您将使用XMLHttpRequest(XHR)对象公开的XMLHttpRequest(XHR)对象通过您select的框架或库来调用这些URL。 现在认为框架/库的标准和最佳实践是将这些请求作为承诺实现http://wiki.commonjs.org/wiki/Promises/A 。 你应该自己阅读一下,但是我可以总结一下,它是一个asynchronous操作,类似于在同步操作中“尝试,抓取,抛出”。 您将实例化一个承诺对象,并通过它尝试从服务器加载数据,例如,通过GET请求。 确保你已经分配了处理请求的URL(服务器端路由)的请求。 这个对象,你实例化,然后通过请求到服务器,承诺返回请求的结果一旦它从服务器回来(不pipe它是否成功)如果成功,它会调用一个你已经写好的函数,并且将提供来自服务器的数据。 如果失败,它会调用另外一个函数,也是由你写的,并且会提供错误对象(或者“失败原因”),所以你可以适当的处理错误。

希望这有助于回答你的问题。

你只需要路由你dynamic服务的请求。 你的HTML,CSS,JS都是静态资产。 所以你需要处理的路由是你的数据。

这听起来像你想要一个Restful API ,这基本上意味着你有特定资源的URL和HTTP动词来操纵它们。

就像是:

  • GET /books.json – 获取所有书籍
  • POST /books.json – 使用请求正文中传递的属性创build一本新书
  • GET /books/123.json – 获取ID为123的书
  • PUT /books/123.json – 使用请求正文中传递的属性更新现有书籍

这篇博文似乎展示了如何在Express中进行设置。

一旦你有一个合理的API提供JSON,你只需要让你的AJAX调用根据你想要获取的对象来使用它。