Проблема с использованием обработчика активов wails с использованием пользовательского маршрутизатора

Я пытаюсь использовать собственный мультиплексор с обработчиком активов Wails, однако при попытке получить что-либо я продолжаю получать страницу index.html. Я добавил оператор печати вверху функции ServeHTTP мультиплексора, но он вызывается только один раз, при загрузке favicon.ico в начале программы.

У меня есть следующий основной файл:

package main

import (
    "embed"
    "fmt"

    "github.com/Nigel2392/router/v3"
    "github.com/Nigel2392/router/v3/request"
    "github.com/wailsapp/wails/v2"
    "github.com/wailsapp/wails/v2/pkg/options"
    "github.com/wailsapp/wails/v2/pkg/options/assetserver"
)

var ROUTER *router.Router = router.NewRouter(true)

func init() {
    ROUTER.Get("/about", func(r *request.Request) {
        fmt.Println("About")
        r.WriteString("About")
    })
}

//go:embed all:frontend/dist
var assets embed.FS

func main() {
    // Create an instance of the app structure
    app := NewApp()

    // Create application with options
    err := wails.Run(&options.App{
        Title:  "new",
        Width:  1024,
        Height: 768,
        AssetServer: &assetserver.Options{
            Assets:  assets,
            Handler: ROUTER,
        },
        BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
        OnStartup:        app.startup,
        Bind: []interface{}{
            app,
        },
    })

    if err != nil {
        println("Error:", err.Error())
    }
}

Я вижу следующий вывод в терминале:

DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/favicon.ico'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/favicon.ico' failed, using AssetHandler

# Print statement at the top of the serveHTTP function, 
# prints the requested path, and the available router paths.
Path:  /favicon.ico
GET /about ->

DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/about'


To develop in the browser and call your bound Go methods from Javascript, navigate to: http://localhost:34115
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/@vite/client'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/node_modules/vite/dist/client/env.mjs'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/about'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/@vite/client'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/node_modules/vite/dist/client/env.mjs'
DEB | [ExternalAssetHandler] Loading 'http://localhost:3000/about'

При попытке получить страницу about для тестирования, как описано в документации wails AssetServer, я получаю индексную страницу:

let resp = await fetch("/about")
undefined
await resp.text()
'<!DOCTYPE html>\n<html lang = "en">\n<head>\n  \x3Cscript type = "module" src = "/@vite/client">\x3C/script>\n\n    <meta charset = "UTF-8"/>\n    <meta content = "width=device-width, initial-scale=1.0" name = "viewport"/>\n    <meta name = "wails-options" content = "noautoinject" />\n    \x3Cscript src = "/wails/ipc.js">\x3C/script>\n    \x3Cscript src = "/wails/runtime.js">\x3C/script>\n    <title>new</title>\n</head>\n<body>\n    <h1>Index!</h1>\n    <a href = "/about">Go To About!</a>\n</body>\n</html>\n'

Почему не вызывается функция serveHTTP?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Журнал показывает, что используется ExternalAssetHandler. Это означает, что используется внешний интерфейсный сервер разработки. И все запросы ресурсов сначала перенаправляются на внешний интерфейсный сервер разработки. Только когда внешний интерфейсный сервер разработки отвечает кодом состояния 404 или 405, будет использоваться обработчик, указанный в assetserver.Options. В настоящее время большинство внешних серверов разработки для SPA обслуживают index.html запросы, не связанные с активами. Вот почему вы видите поведение.

Обходной путь — настроить внешний интерфейсный сервер разработки для обхода запроса. Для Vite измените файл конфигурации, добавив что-то вроде этого:

export default defineConfig({
  server: {
    proxy: {
      '/about': {
        bypass: function () {
          // Return false to produce a 404 error for the request.
          return false;
        },
      },
      // or for all the requests that start with "/api/"
      '/api/': {
        bypass: function () {
          return false;
        },
      },
    },
  },
});

Но я бы рекомендовал этого не делать. Поскольку обработчик ресурсов, как следует из его названия, предназначен для обслуживания динамических ресурсов. И у Wails есть свой способ вызова связанных методов Go. Вы должны попробовать.

Использованная литература:

Другие вопросы по теме