草庐IT

angularjs - FileServe和Routing的配合更流畅

coder 2024-07-08 原文

我有一个问题,我想在 FileServe / 上提供我的主要 AngularJS(Yeoman 部署)应用程序文件夹,但它会破坏我所有的路由器绑定(bind)。有什么方法可以保留它们并保持我的路线完整吗?

在下面的代码中,我仍然必须转到 /app 并重新绑定(bind)其他文件夹,因为我还不想对 Grunt 文件进行太多调整,所以添加了文件夹的一些额外备份路径绑定(bind)。

func initializeRoutes() {
    // Handle all requests by serving a file of the same name
    fileHandler := http.FileServer(http.Dir(*clFlagStaticDirectory))
    bowerFileHandler := http.FileServer(http.Dir("../bower_components"))
    imagesFileHandler := http.FileServer(http.Dir("../app/images"))
    scriptsFileHandler := http.FileServer(http.Dir("../app/scripts"))
    stylesFileHandler := http.FileServer(http.Dir("../app/styles"))
    viewsFileHandler := http.FileServer(http.Dir("../app/views"))

    // Setup routes
    mainRoute := mux.NewRouter()
    mainRoute.StrictSlash(true)
    // mainRoute.Handle("/", http.RedirectHandler("/static/", 302))
    mainRoute.PathPrefix("/app").Handler(http.StripPrefix("/app", fileHandler))
    mainRoute.PathPrefix("/app/bower_components").Handler(http.StripPrefix("/bower_components", bowerFileHandler))
    mainRoute.PathPrefix("/bower_components").Handler(http.StripPrefix("/bower_components", bowerFileHandler))
    mainRoute.PathPrefix("/images").Handler(http.StripPrefix("/images", imagesFileHandler))
    mainRoute.PathPrefix("/scripts").Handler(http.StripPrefix("/scripts", scriptsFileHandler))
    mainRoute.PathPrefix("/styles").Handler(http.StripPrefix("/styles", stylesFileHandler))
    mainRoute.PathPrefix("/views").Handler(http.StripPrefix("/views", viewsFileHandler))

    // Basic routes
    // User routes
    userRoute := mainRoute.PathPrefix("/users").Subrouter()
    userRoute.Handle("/login", handler(userDoLogin)).Methods("POST")
    userRoute.Handle("/logout", handler(userDoLogout)).Methods("GET")
    userRoute.Handle("/forgot_password", handler(forgotPassword)).Methods("POST")

    // Bind API Routes
    apiRoute := mainRoute.PathPrefix("/api").Subrouter()

    apiProductModelRoute := apiRoute.PathPrefix("/productmodels").Subrouter()
    apiProductModelRoute.Handle("/", handler(listProductModels)).Methods("GET")
    apiProductModelRoute.Handle("/{id}", handler(getProductModel)).Methods("GET")

    // Bind generic route
    http.Handle("/", mainRoute)
}

所以我的目标是服务 /app 作为我的 / 主路径,但保留我所有的 Mux 路由以赢得 FileServe。因此,如果我有一个 /app/users/login 文件夹,它不会加载,而是让路由器获胜。

注意:我纯粹通过 HTTPS 提供服务,而没有通过 HTTP 提供服务。

提前致谢!这让我伤透了脑筋,这是我完全开始编写前端代码之前需要弄清楚的最后一件事 :)。

最佳答案

在我看来,您想更改路由评估的顺序,使 /users/login 和类似的在/。并且 / 应该是 FileServer 的服务器。

据我所知,路由将按照它们被定义(添加到路由器)的顺序进行匹配。所以你只需要在 / 之前移动你的 API 和其他动态路由。

以下代码的工作方式类似:

  • /test 匹配在文件服务器之前进行评估并返回字符串“OK”
  • 然后文件服务器返回该路径下的文件

代码:

package main

import (
    "github.com/gorilla/mux"
    "net/http"
)

func main() {
    appFileHandler := http.FileServer(http.Dir("/Users/alex/Projects/tmp/so/app"))
    r := mux.NewRouter()
    r.PathPrefix("/test").HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        w.Write([]byte("OK"))
    })
    r.PathPrefix("/").Handler(appFileHandler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

关于angularjs - FileServe和Routing的配合更流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31636909/

有关angularjs - FileServe和Routing的配合更流畅的更多相关文章

  1. ruby-on-rails - 获取 ActionController::RoutingError(当尝试使用 AngularJS 将数据发布到 Rails 服务器时,没有路由匹配 [OPTIONS] "/users" - 2

    尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg

  2. ruby-on-rails - 未初始化的常量 ActionDispatch::Routing::Routes (NameError) - 2

    我正在学习clickatell教程,我的代码如下所示。但是我得到了错误uninitializedconstantActionDispatch::Routing::Routes(NameError)from/Library/Ruby/Gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.rb:258:in`instance_exec'from/Library/Ruby/Gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.

  3. zlmediakit搭建和配合ffmpeg使用 - 2

    前言本来是自己按照文档搭建好使用的,结果用完就扔,部署新服务器的时候,又查了一遍,不仅耽误时间,还做了很多无用功,坑死自己系列。。。所以赶紧记录一下,争取以后再用到不要再翻各种文档了1.zlmediakit搭建:链接:https://zhuanlan.zhihu.com/p/366774975这篇文章写得已经非常详细了,就不再拾人牙慧了2.ffmpeg安装:虽然上面的搭建文档说不用安装ffmpeg,但是如果使用命令的话,肯定还是要安装的(不安装指的是在项目中调用api)1).sudoapt-getupdate2).sudoapt-getinstallffmpeg3.测试(;推流路径格式是:rt

  4. 【鲁大师实验室】我失去的东西一定要拿回来 魅族20 PRO流畅度重夺第一 - 2

      2009年2月18日,魅族第一部手机M8正式发布。2021年9月22日,魅族18s系列在珠海发布。等了一年半,我们终于等来了魅族20系列。  魅族20PRO正面采用了6.81英寸的2K120HzE6屏幕,背面为高雾AG玻璃,配合高亮的铝合金中框,质感拉满。7.8mm的机身、209g的重量和50:50的重量配比也颇有魅族对于工匠精神的坚持。  魅族20PRO搭载了高通骁龙8Gen2处理器,加入LPDDR5X、UFS4.0极速存储组合,鲁大师跑分来到了1415138分。  魅族20PRO这次的性能调教突出一个“猛”字,这个分数领跑一众骁龙8Gen2机型。跑分相比小米13Pro提升了12.77%

  5. 旧手机改服务器,并配合花生壳实现外网访问的方法 - 2

    旧手机改服务器,并配合花生壳实现外网访问的方法前提准备开始手机端操作开始电脑端操作至此所有操作结束前提准备1.手机必须root2.busybox3.linuxdeploy4.花生壳安卓内网穿透版(下载时注意,有个管理版,有个穿透版,不要下错)5.re管理器6.ssh软件(电脑上用,也可以不用直接用cmd也一样)开始手机端操作1.安装busybox,装完成后打开,点击左上角的设置按钮,找到设置选项设置语言为中文简体。完全退出软件,再次打开会发现变中文了,主界面点击安装。安装完毕后界面上会显示啥啥啥yes。中间会申请root权限,一定要允许。2.用re管理器去看system/xbin里有没有文件,

  6. ruby-on-rails - 更改 :id parameter in Routing resources for Rails 的名称 - 2

    我四处查看如何更改动态参数槽,发现这篇文章完全符合要求。帖子是https://thoughtbot.com/blog/rails-patch-change-the-name-of-the-id-parameter-in基本上它所做的是,如果以下是路线:map.resources:clients,:key=>:client_namedo|client|client.resources:sites,:key=>:namedo|site|site.resources:articles,:key=>:titleendend这些路由创建以下路径:/clients/:client_name/cli

  7. javascript - angularjs $state 和 $rootScope.$on($stateChangeStart) 问题 - 2

    我已经回答了多个问题,但还没有找到解决方案。我对状态处理有疑问。$urlRouterProvider.otherwise(function($injector,$location){var$state=$injector.get("$state");$state.go("cover");});$stateProvider.state('auth',{url:'/auth',templateUrl:'../views/authView.html',controller:'AuthControllerasauth'}).state('users',{url:'/users',templat

  8. javascript - 在具有静态内容的 angularjs bootstrap 选项卡上处于事件状态 - 2

    我正在使用AngularBootstrapUI来显示带有静态内容的标签集。我对此感到沮丧,因为UIBootstrapTab文档仅显示导航到通过绑定(bind)ng-repeat创建的选项卡。tab1GotoTab3tab2我发现了一些东西听到Stackoverflow但这不适用于当前版本的AngularBootstrapUI..Plunker 最佳答案 要将选项卡设置为事件状态,您需要在范围内将bool标志设置为“true”并将其与给定选项卡的active属性相关联。这看起来像tab1tab2当tabOneActive设置为true

  9. javascript - 结合 AngularJS、jQueryUI、Angular-Drag-Drop 排序列表 - 2

    我遇到以下情况,我需要允许用户从列表中选择对象并将它们拖/放到某个插槽中:对象的大小可以是插槽的一到三倍。所以如果用户将Object1拖到Slot0,那么它只占用Slot0(startSlot=0和endSlot=0)。但是,如果用户将对象3拖动到插槽3,则它会占用插槽3、4和5(startSlot=3和endSlot=5)。将对象放入槽中后,用户可以通过在槽中单击并上下拖动对象来重新排序对象。对象不能相互重叠:我正在使用Angular,所以我正在从数据库中读取对象列表,并且我有一个槽数变量。我尝试了几种解决方案。我相信使用jQuery和jQueryUI可拖动、可放置和可排序是解决方案

  10. javascript - AngularJS 中添加的自定义 header 仅显示在 Access-Control-Request-Headers 上 - 2

    我正在尝试使用拦截器使用以下代码向AngularJS应用程序中的每个请求添加自定义header:angular.module('app').factory('httpRequestInterceptor',function(){return{request:function(config){config.headers['testheader']='testheaderworks';returnconfig;}};});angular.module('app').config(function($httpProvider){$httpProvider.interceptors.push

随机推荐