Node.js 和单页 Web 应用程序

2024-01-02

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

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

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

有人可以解释一下吗?


单页应用程序是那些运行在单个 HTML 文档上的应用程序。这意味着,如果您想向用户显示一些不同的内容,根据应用程序的状态,您将需要进行一些 DOM 操作(用不同的 HTML 剪切并替换当前文档的某些元素)以更新用户看到的“视图”。对不起,如果这对你来说是显而易见的,请不要生气。我想我应该从这里开始。请耐心等待,我将解释您的路由情况将如何发生(或多或少)。

URL 由几个不同的部分组成,每个部分都会通知浏览器下载用户尝试访问的资源所需的特定信息。通常,您要查找的资源位于某处的服务器上,并且浏览器知道这一点,因为 URL 中的“协议”(“http:”) 和“主机”(“www.mydomain.com”) 等部分,因此它会转到该服务器来查找您所请求的内容。 URL 中还有“查询”参数,它们向服务器提供一些有关特定操作的附加信息,例如搜索查询的搜索词。查询参数之后是“哈希”。哈希是单页应用程序的魔力发生的地方......呃,嗯,有点......

首先介绍一下哈希。当您向 URL 添加“#”时,浏览器会将其后面的信息解释为当前显示文档中的某个位置(元素)。这意味着,如果您有一个 'id' 为 'main' 的元素,并且将 '#main' 添加到 URL 末尾,如下所示: 'http://www.example.com#main',浏览器将将“滚动”(通常是“跳转”)到该元素的开头,以便您可以看到它。但请注意,如果您输入 'http://www.example.com/#main http://www.example.com/#main'(哈希值与 URL 之间用斜杠分隔),然后您将强制重新加载整个页面,浏览器将尝试在服务器上查找名为“#main”的文件(我打赌它找不到) 。

这里的要点是,如果 URL 中存在哈希值,浏览器将不会尝试离开当前文档,上面提到的情况当然是例外,这很好,因为单页应用程序不想离开该页面或从服务器请求新文档。 (看看单页应用程序的路由有何不同?)

现在,关于哈希的整个事情对于单页应用程序来说并不重要,因为您可以在不处理所有内容的情况下制作一个应用程序。您真正需要的只是一堆点击处理程序和 DOM 操作...但是,这意味着用户将无法共享指向应用程序中特定视图的链接。 URL 永远不会改变,我们永远无法直接导航到任何特定的视图。我们总是从应用程序的起始位置开始,这很容易成为一个非常烦人的情况。

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

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

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

这实际上是一个相当复杂的情况,因为 HTML5 允许我们能够放弃哈希(借助服务器上的一些链接重写),并且还能够使用“后退”和“前进”按钮,就像我们“实际上,我们已经离开了原始文档(我们没有这样做,因为我们只是将浏览器指向了完全相同的 URL,只是修改了哈希值,因此没有发生新页面加载)。传统的站点导航和链接可以通过利用浏览器的 History API 来实现,该 API 从版本 10 开始可用于 IE(我相信),其他大型浏览器供应商很早就已经开始使用它,因此利用框架这项技术将允许您的用户无需 URL 中的哈希值即可导航您的应用程序。解释这是一种消遣,对于理解单页应用程序中的路由来说不是必需的,但它很有趣,无论如何你最终都必须学习它,可能......

应使用 AJAX 从服务器请求 JSON。 AJAX 请求将始终到达您的服务器,因为您没有在 AJAX 请求中包含哈希符号(这样做会很荒谬,因为哈希仅用于文档内浏览),因此服务器端路由必须负责公开您的数据 API(考虑 RESTful 的 API)。虽然这不是它们在单页应用程序中的唯一目的,但这可能是它们最重要的目的。

Soooo,总而言之,您将有两组路线。一个在客户端(作为 AngularJS 或 EmberJS 等客户端框架的一部分,这样的例子不胜枚举……我更喜欢 Angular,但它的学习曲线相当陡峭。),另一个在服务器上。当您想到“服务器路由”时,请考虑数据 API。当您想到“页面路由”时,请记住,这一切都由您随初始服务器响应一起交付的 JavaScript 在客户端上处理(这是将 HTML 呈现到浏览器所涉及的唯一必要的服务器端路由,加载您的“index.html”以及所有必要的脚本和样式表等)。您将使用express.static中间件来提供静态文件,因此您不必担心为这些东西分配路由。

编辑 快速提及 AJAX 实现。 在服务器上,您将拥有与 Alex 作为示例提供的路由类似的路由,并且您将使用您选择的框架或库公开的任何 XMLHttpRequest (XHR) 对象从客户端调用这些 URL。现在,框架/库将这些请求作为承诺来实现或多或少被认为是标准和最佳实践http://wiki.commonjs.org/wiki/Promises/A http://wiki.commonjs.org/wiki/Promises/A。您应该自己阅读一些相关内容,但我也许可以通过说它是一个异步操作来总结它,类似于同步操作中的“try、catch、 throw”。您将实例化一个 Promise 对象,并通过它尝试从服务器加载数据,例如通过 GET 请求。确保您已分配函数来处理对您发出请求的 URL(服务器端路由)发出的请求!您实例化并随后通过该对象向服务器发出请求,承诺一旦从服务器返回请求的结果(无论是否成功),就会将请求的结果返回给您,如果成功,它将调用您编写的函数,将为它提供来自服务器的数据。如果失败,它将调用另一个由您编写的函数,并向其提供错误对象(或失败的“原因”),以便您可以适当地处理错误。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 和单页 Web 应用程序 的相关文章

随机推荐

  • Code::Blocks 无法编译应用程序

    这是我的你好世界代码 include
  • Mongoid 和 has_secure_password

    我正在尝试使用 mongoid 而不是活动模型来使用 Rails 3 1 身份验证 class User include Mongoid Document include ActiveModel SecurePassword has sec
  • 在哪里可以找到 Oracle JVM 的默认 -Xss(堆栈大小)值?

    有没有人找到过列出默认值的单个 JVM 文档 Xss不同版本的 Oracle JVM 和不同操作系统的值 我已经能够在中找到这张表jrockit 文档 http download oracle com docs cd E13150 01 j
  • 单例组件不能依赖于作用域组件

    在工作的同时Android应用程序使用Dagger2用于定义时的依赖注入Dagger组件我收到此错误 Error 13 1 error This Singleton component cannot depend on scoped com
  • 实现 copy.deepcopy() 克隆函数

    仅用于教育目的 我正在尝试实现一个克隆功能copy deepcopy 经过一些有趣的代码玩弄和谷歌搜索后 我想出了以下函数 def my deepcopy data if isinstance data dict result for ke
  • 为什么里氏代换原理需要论证是逆变的?

    其中一项规则是里氏替换原则 https en wikipedia org wiki Liskov substitution principle施加在派生类中的方法签名是 子类型中方法参数的逆变 如果我理解正确的话 就是说派生类的重写函数应该
  • 如何设置JQGRID ROW背景颜色?

    我想根据条件设置 JQGRID 行 bgcolor 怎么做 我正在使用 php 提前致谢 look at jqGrid 根据单元格值对网格中的整行进行着色 https stackoverflow com questions 2931732
  • 使用 REST API 将测试结果与测试用例链接起来

    我们使用 cypress 为 Web 应用程序实现了 UI 测试 并且它们在 Azure DevOps 中的发布管道上执行 我们需要将 ui 测试和测试结果与测试计划中定义的测试用例链接起来 为了将 ui 测试与测试用例链接起来 我们使用
  • 什么是MySQL排序规则,如何在实践中使用它?

    假设我想用 4 种语言用一些奇怪的语言制作一个搜索引擎 英语 瑞典 希伯来语 阿拉伯 我如何在 MySQL 中设置排序规则 排序规则定义 用于存储字符的字符集 UTF 8 ISO 8859等 排序和呈现规则 如果您想要不同的语言 正如您提到
  • DXF文件块中的polyLines顶点和点之间有什么关系?

    DXF文件块中的折线和点之间有什么关系 如果我提供档差表文件 如何连接它们 另一个问题 缩放点太少 所以效果不好 如下图所示 作为第一种答案 如果缩放点太少 是否需要在两个已知缩放点形成的圆弧上生成新的缩放点 不存在这样的关系 DXF 格式
  • try catch和finally块的执行顺序

    我对 try catch 和 finally 块执行的顺序感到困惑 我还想知道什么时候应该使用try catch块以及应该在try catch块中放入什么 我还想知道 try 块中是否出现了一些异常 那么如果采取了与 try 块相对应的操作
  • 对多个Mysql语句进行分组以获取多个状态的计数[重复]

    这个问题在这里已经有答案了 目前 我正在使用 Mysql 和 CodeIgniter 在特定时间范围内从数据库中获取条目 每个条目在数据库中的状态为 D N Y 现在 为了显示此数据 我对每个状态都有一个不同的语句 我想将其分组为 1 个语
  • 使用 EBX 寄存器进行内存访问的模式是什么?

    我正在学习逆向工程的基础知识 在逆向crackme时 我碰巧在几乎每个函数的开头都看到了这种模式 pushl ebp movl esp ebp pushl ebx because ebx is a callee saved register
  • Google 地图 API v3 颜色自定义

    我正在尝试使用谷歌地图实现如上图所示的地图 我通过在 StyledMapType 对象中将饱和度设置为 100 来制作地图灰度 并使用 Circle 对象在标记周围绘制半径 现在整个地图都是灰度的 因为我无法在圆圈内设置另一个饱和度级别 有
  • 云中安全的协作软件开发环境

    我正在寻找一个安全的协作软件开发环境 例如在云中工作的 Chaperon 它应该防止代码被复制粘贴到环境之外 并且应该采取一切措施来防止 检测和阻止 IP 盗窃 当然 它应该包括用于颠覆跟踪和调试的所有常用 IDE 工具 有什么建议么 这样
  • 运行任何单元格的 Google Colab 都会收到与 JavaScript 相关的错误

    执行任何单元格时收到浏览器白色弹出窗口 Error Could not load the JavaScript files needed to display output This is probably because your Goo
  • 如何监听(“关闭”事件)flutter web 中的文件下载窗口?

    我的代码允许使用打开文件上传窗口universal html InputElement uploadInput universal html FileUploadInputElement 网页颤动并选择必要的文件将它们加载到项目中 如果用户
  • 在舍入为 0 之前,R 呈现的最小数字是多少?

    我正在使用 R 软件 引导 Kolmogorov Smirnov 测试 对非常大的数据集进行一些统计分析 这意味着我的 p 值都非常小 我已经 Bonferroni 纠正了我执行的大量测试 这意味着我的 alpha 值也非常小 以便拒绝原假
  • 是否有与 goog.object.extend 等效的纯函数?

    Per 关闭文档 http docs closure library googlecode com git namespace goog object html 用另一个对象扩展一个对象 这是 就地 操作的 它不会创建新对象 示例 var
  • Node.js 和单页 Web 应用程序

    我正在寻找后端的express js 和客户端的JS 我的应用程序是单页 Web 应用程序 服务器仅提供 JSON 消息 我的问题是关于 Express 的 路由 是否应该使用路由来连接 UI 和服务器端业务逻辑 这将如何与我的单页应用程序