Angular 和 Sails 路由配置

2024-04-19

是否有任何 Sails.js(或 Node)配置可以阻止 Angular 路由工作?

无论我采取什么方法,除了 sails 的routes.js 中的路线之外,每条路线都会返回 404。

我尝试过 1.2 和 1.3 Angular 版本,并且使用的是 Sails v 0.9.15。

所有脚本均按正确顺序加载(例如):

<script src="/linker/js/libs/angular/angular.js"></script>
<script src="/linker/js/libs/angular/angular-resource.js"></script>
<script src="/linker/js/libs/angular/angular-route.js"></script>
<script src="/linker/js/libs/angular/angular-sanitize.js"></script>
...
<script src="/linker/js/app.js"></script>

我正确使用 ngRoute:

var myApp= angular.module('myApp', ['ngRoute']);

这是我在 Angular 的 app.js 中的路线:

myApp.config(['$routeProvider', function ($routeProvider) { 

$routeProvider
    .when('/profile',
        { templateUrl: 'linker/views/profile.html', controller: 'MainCtrl' })
    .when('/profile-detail',
        { templateUrl: 'linker/views/profile_detail.html', controller: 'MainCtrl' });
}]);

我还使用位置提供程序:

myApp.config(function ($locationProvider) {
    $locationProvider.html5Mode(true);
});

额外细节:

ng-app 和 ng-view 放置正确,并且我的路径是正确的。我可以使用 Angular 正确显示 profile.html(并且还包含来自 Sails 的 Restful API 的数据)。

问题是,我只能对 Sails 的routes.js 中定义的路线执行此操作。

Example:

module.exports.routes = {
  '/' : {
    controller: 'main',
    action: 'index'
  },
  '/signup' : {
    controller: 'main',
    action: 'signup'
  },
  '/login' : {
    controller: 'main',
    action: 'login'
  },
  '/profile': {
    controller: 'users',
    action: 'profile'
  } //......

所以基本上,为了用 Angular 显示一些 html 内容,我必须在 Sails 的配置中定义完全相同的路由,这是没有意义的。

有任何想法吗?附:如果需要,我将提供额外的数据。


尝试删除 html5 模式看看会发生什么:

$locationProvider.html5Mode(false);

如果您使用 sails 应用程序只是为 Angular 应用程序提供 API,但您使用相同的后端来服务 Angular 代码,那么您可以在所有 API 路由前面加上“api”前缀,以防止与 Angular 路由发生冲突。

代替/profile你将会拥有/api/配置文件


EDIT:我研究了 Sails.js 框架并制作了一个小应用程序来测试它。

我能够成功地在有角度的工作中找到不受帆定义的路线。

我认为对角度路由的工作原理存在误解。

如果您使用window.location更改路径或手动输入url,浏览器将向服务器发送get请求。因此,在您的情况下,将会有一个对 /p​​rofile 或 /profilee 的请求,服务器将查看可用的路由,如果没有匹配,将抛出 404。

为了防止这种情况,您实际上应该使用角度方法更改路径。角度使用'#'路径中的符号,以防止浏览器在 url 更改时向服务器发送请求。浏览器会忽略之后的更改'#'象征。或者在您的情况下,使用 html5 模式可以实现类似的效果。请注意,当用户刷新页面时,使用 html5 模式可能会引起问题,因为那时将向服务器发出请求(更多关于如何解决这个问题,请参见下文)。

因此,您应该使用 javascript 来更改路径$地点 http://docs.angularjs.org/api/ng/service/%24location服务。在你的角度视图中,你还可以使用普通的锚标签,因为角度会解析这些标签:

<a href="/profilee">Go to profile</a>

由于您拥有的是单页应用程序,因此所有视图都由客户端处理。根目录(/)之外的所有路径都是 Angular 创建的虚拟路径。它们通常不存在于服务器中。只有 root 可用。当使用html5模式时可能是个问题 http://blog.releaseboard.com/2013/12/angular-js-gotcha-2-html5-mode.html.

解决此问题的一种方法是重写服务器的路由以服务其他所有内容,就像对根路径的请求一样。在 sails 中,他们甚至建议如何在 config/routes.js 中做到这一点:

  // What about the ever-popular "vanity URLs" aka URL slugs?
  // (you might remember doing this with `mod_rewrite` in Apache)
  //
  // This is where you want to set up root-relative dynamic routes like:
  // http://yourwebsite.com/twinkletoez
  //
  // NOTE:
  // You'll still want to allow requests through to the static assets,
  // so we need to set up this route to ignore URLs that have a trailing ".":
  // (e.g. your javascript, CSS, and image files)
  'get /*(^.*)': 'UserController.profile'

关于sail中的API,您可以在config/controllers.js文件中配置前缀:

/**
 * `prefix`
 *
 * An optional mount path for all blueprint routes on a controller, including `rest`, 
 * `actions`, and `shortcuts`.  This allows you to continue to use blueprints, even if you
 * need to namespace your API methods.
 *
 * For example, `prefix: '/api/v2'` would make the following REST blueprint routes
 * for a FooController:
 *
 * `GET /api/v2/foo/:id?`
 * `POST /api/v2/foo`
 * `PUT /api/v2/foo/:id`
 * `DELETE /api/v2/foo/:id`
 *
 * By default, no prefix is used.
 */
prefix: '',
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 和 Sails 路由配置 的相关文章

  • Azure Pipelines 中的 NG 构建失败,出现 NPM 错误 134

    大约 50 的托管构建失败 并出现 npm 错误 134 我正在使用托管 vs2017 构建具有相同构建定义的相同提交 我正在使用 Angular CLI 构建 Angular 应用程序 npm 任务调用 run build 它在我的 pa
  • 存储应用程序配置设置

    在 AngularJS 中存储应用程序配置设置的最佳位置是什么 这可能是应用程序常量 查找等 可以从控制器和服务或工厂使用 我可以创建一个单独的服务来存储和检索这些东西 但我想知道是否有另一个合适的地方来存储和检索这些东西 您可以使用持续的
  • AngularJS:清除 $watch

    我的 AngularJS 应用程序中有一个监视功能 scope watch quartzCrystal function 但是 在某些条件之后 在我的示例中 更改我的页面 单页应用程序 https en wikipedia org wiki
  • AngularJS、ocLazyLoad 和加载动态状态

    app define angular angular ui router ocLazyLoad config common layout services menuService function angular use strict va
  • 如何在指令中插入 $compile 的 HTML 代码而不出现 $digest 递归错误?

    我有一个指令 根据ng repeat项目数据 来自数据库 使用 switch case 构建自定义 HTML app directive steps function compile return restrict A template h
  • 如何从模板脚本访问 AngularJS 变量

    我的控制器 scope totals totals 我的模板 按 html 注入的预期工作 totals 但我需要的是访问变量totals在模板的脚本中 如下所示 我试过了 scope totals totals totals 等 均无济于
  • Electron 应用程序可以与 java 代码集成吗?

    由于node js仍然缺乏Java中存在的重要功能 因此我想使用Java而不是node js 并使用Web语言 html js css 创建客户端 Electron 是跨平台的 java 也是跨平台的 因此似乎有一个能够两全其美的解决方案
  • angular.isdefine 有什么好处?

    有什么好处angular isdefined超过和超过foo undefined 我一时想不出有什么好处 在 Javascript 中以任何方式访问真正未定义的变量 除了 typeof 都会抛出错误 你只能使用Angular isDefin
  • 如何在托管的 VSO 构建代理中设置 Node.js 和 NPM 版本号?

    在 Visual Studio Online 中 您现在可以在生成定义的 常规 选项卡上设置生成依赖项 但是 有没有办法设置Node js和NPM的版本 托管构建代理当前似乎正在使用 Node js v0 12 7 和 NPM v2 11
  • 在工厂和控制器之间共享 http.get 数据

    我成功创建了一个获取 php 文件输出 JSON 的工厂 我的问题是如何从控制器内访问它 myApp angular module myApp myApp factory mainData http gt http get gethome
  • Promise 完成后导出模块

    我实际上想将 read 函数放在不同的模块中 然后在我的主 app js 中需要它 我对使用承诺还很陌生 修改 var dir require node dir var files function getFiles return new
  • Angular 2 http post + Nodejs Express

    我无法在服务器上获取帖子参数 我将 Angular 2 应用程序中的 post 请求发送到 Nodejs Express 服务器 这是我在 Angular 2 中的代码 import Injectable from angular2 cor
  • 在 JSFiddle 上运行的简单 AngularJS

    如何用以下代码制作 jsfiddle div ul li num li ul div
  • 将图像从 JQuery 上传到 Node JS

    我需要从我的网站上传图像文件HTML页 但是 我不会使用form标签 因为还有其他form稍后将用于将数据传递到服务器的字段 文本字段 复选框等 我的后端在Node JS 我想要的只是从Node Js结尾 我怎样才能做到这一点 HTML d
  • ng-invalid-parse 类如何添加到表单中

    我正在使用自定义角度指令来验证表单中的字段 当其中一项验证失败以及自定义错误时 该类ng invalid parse也被添加到该字段中 这是正常行为吗 如果是这样 是什么原因造成的 ng invalid parse当解析器返回未定义时被添加
  • 在 ng-repeat 中使用 bootstrap popover

    我有一个引导程序弹出窗口 它在有角度的外部工作ng repeat a href class tt1 Hover over me a 一旦我在 ng repeat 中使用它 它就会停止工作 我在角度控制器构造函数中初始化弹出窗口 tt1 po
  • 如何阻止 HTML 输入字段中的特殊字符? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想问一下如何在html输入字段中阻止 等特殊字符 为什么不使用html5呢
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • 如何通过ajax点击时从javascript文件执行节点(控制台)命令

    我是 Node js 新手 这是我的问题 例如 我得到了 Web 应用程序 并且从该应用程序中我有一个按钮 单击按钮后我想运行节点控制台命令 例如 node socket io So button on click function run
  • 尝试在 Windows 上执行 package.json 中的脚本会引发 JScript 错误

    所以我正在尝试构建 javascriptair site 在 的里面package json有一个 npm 脚本指向 javascript 命令 package scripts 找到该存储库https github com kentcdod

随机推荐

  • DataGridTemplateColumn 中的 ComboBox 不显示 SelectedItem

    我想制作其中包含 ComboBox 的自定义 DataGrid 列 组合框的 ItemSource 绑定到枚举 组合框的 selecteditem 绑定到集合元素中选定的枚举值 这是代码
  • 保持java套接字打开?

    我正在制作一个会自动更新的程序 游戏 我有更新部分 但没有检查版本 我本以为这会很容易 这就是我所做的 我为游戏编写了一个更新程序 并且编写了一个服务器 每次客户端 更新程序连接时 服务器都会启动一个线程 线程处理一切 游戏更新程序读取一个
  • Symfony 2 功能测试外部 URL

    无论我做什么 我总能得到一个 Symfony Component HttpKernel Exception NotFoundHttpException 否 已找到 的路线 in crawler gt text 当我尝试使用以下命令请求外部
  • 如何向 img 标签添加到期日期?

    我正在使用 Page Speed Firebug 扩展来帮助提高页面性能 我有一个包含大量图像的页面 它提出的建议之一是 利用浏览器缓存 以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周后到期 http www mysite c
  • 使用Jquery打印div内容

    我想使用 jQuery 打印 div 的内容 这个问题已经在 SO 中提出 但我找不到正确的 有效的 答案 这是我的 HTML div p This is a sample text for printing purpose p div
  • PostgreSQL 恢复后,我收到“关系 django_session 的权限被拒绝”

    我目前正在实时服务器和本地运行我的 Django 1 1 1 站点和 PostgreSQL 8 4 2 当我尝试从本地机器上的实时服务器恢复我的备份之一时 在本地访问我的站点时出现以下错误 http 本地主机 8000 http local
  • Nodejs 在异步上创建简单队列

    在下面的示例代码中 我可以同时运行多功能 Promise all sendMoneyToRequestedUser data saveTransferMoneyTransaction data then function results l
  • 如何在保存到数据库之前在JSP中转义html?

    我现在正在学习 JSP 和 Java 并写了一个 非常 简单的留言簿来开始使用 JSP 但我想确保没有人可以使用 CSS 因此我需要在将 HTML 代码保存到 mySQL 数据库之前删除它 我已经在这里搜索并找到了 PreparedStat
  • 更改 MVC 5 中的用户名 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 ASP NET MVC5 和 Identity 2 0 测试版 用户可以更改用户名吗 我正在尝试使用 Use
  • IActionFilter 与 IResultFilter

    请解释一下 IActionFilter 和 IResultFilter 之间的区别 我了解 OnActionExecuting 发生在操作方法执行之前 OnActionExecuted 发生在操作方法执行之后 进一步了解执行操作方法意味着什
  • 如何让 firebase deploy --email 或 --token 参数起作用?

    我在使用这些 firebase 命令通过 firebase 部署 travis CI 时遇到问题 firebase deploy email FIREBASE USERNAME password FIREBASE PASSWORD fire
  • 通过javascript在html表格中动态添加一列

    我正在编写一个java脚本代码 它将在html中已经存在的表中动态附加一列复选框 我的 html 代码是这样的 table border 1 tr th Email id th th Em th tr table
  • QSignal Manager - 无法将多个信号连接到一个插槽

    我有 4 个 QLineEdits 和 4 个 QPushButtons 如果我单击 QPushButton 我想在相应的 QLineEdit 内设置一些文本 我想使用QSignalMapper来区分每个QButton及其对应的QLineE
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • 复杂类型中的 XJC javaType 适配器

    我想让 XJC 在生成 bean 时在复杂类型中使用 javaType 标记 这是不允许的吗 我真的缺少好的文档和一些可以理解的错误消息 这是我正在尝试的操作 但失败并出现错误 编译器无法支持此转换自定义 它附加到错误的位置 或者与其他绑定
  • Django Rest Framework如何禁止用户更改用户名?

    我正在创造UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名 有一个read only我可以应用该属性 但用户在创建新用户名时将无法设置用户名 但如果没有它 它允许我改变它 还有一个required不幸的是 该属性不能
  • Jquery 数据表主题隐藏页眉/页脚块

    我正在尝试删除该表的页眉 页脚块 Picture of what I am trying to remove 该表的Jquery代码 document ready function var oTable tableSmooth dataTa
  • 迭代器模式 - 错误 C2679:二进制 '<<':找不到采用 'std::string' 类型的右侧操作数的运算符 [重复]

    这个问题在这里已经有答案了 我正在尝试使用迭代器模式进行迭代和打印 但出现错误 这是错误 error C2679 binary lt lt no operator found which takes a right hand operand
  • C++11:如何使用 设置种子

    我正在练习随机库 这是 C 11 的新功能 我编写了以下最小程序 include
  • Angular 和 Sails 路由配置

    是否有任何 Sails js 或 Node 配置可以阻止 Angular 路由工作 无论我采取什么方法 除了 sails 的routes js 中的路线之外 每条路线都会返回 404 我尝试过 1 2 和 1 3 Angular 版本 并且