Heim >Backend-Entwicklung >Golang >Problem bei der Verwendung des Wails-Asset-Handlers mit benutzerdefiniertem Router

Problem bei der Verwendung des Wails-Asset-Handlers mit benutzerdefiniertem Router

WBOY
WBOYnach vorne
2024-02-12 16:30:07984Durchsuche

使用自定义路由器使用 wails 资产处理程序时出现问题

Frageninhalt

Ich versuche, einen benutzerdefinierten Multiplexer mit einem Wails-Asset-Handler zu verwenden, aber wenn ich versuche, etwas abzurufen, wird immer die Seite index.html angezeigt. Ich habe oben in der Funktion „servehttp“ des Muxers eine print-Anweisung eingefügt, diese wird jedoch nur einmal aufgerufen, wenn favicon.ico zu Beginn des Programms abgerufen wird.

Ich habe folgende Stammdatei:

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())
    }
}

Ich sehe im Terminal folgende Ausgabe:

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'

Wenn ich versuche, die betreffende Seite zum Testen abzurufen, wie in der Dokumentation zum Wails-Assetserver beschrieben, rufe ich die Indexseite ab:

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'

Warum wird die Funktion „servehttp“ nicht aufgerufen?

Lösung

Das Protokoll zeigt, dass der externalassethandler。这意味着使用外部前端开发服务器。所有资源请求都会首先转发到外部前端开发服务器。仅当外部前端开发服务器响应 404405 状态代码时,才会使用 assetserver.options 中指定的处理程序。如今,大多数 spa 前端开发服务器都为非资产请求提供 index.html-Dienst genutzt wird. Aus diesem Grund sehen Sie dieses Verhalten.

Die Problemumgehung besteht darin, einen externen Front-End-Entwicklungsserver zu konfigurieren, um die Anfrage zu umgehen. Ändern Sie für Vite die Konfigurationsdatei und fügen Sie den folgenden Inhalt hinzu:

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;
        },
      },
    },
  },
});

Aber ich empfehle, dies nicht zu tun. Denn der Asset-Handler stellt, wie der Name schon sagt, Dienste für dynamische Assets bereit. Wails hat seine eigene Art, gebundene Go-Methoden aufzurufen. Du solltest es versuchen. Referenz:

Das obige ist der detaillierte Inhalt vonProblem bei der Verwendung des Wails-Asset-Handlers mit benutzerdefiniertem Router. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen