Sie entwickeln einen Befehlszeilen-Bot, der mit der Instagram-API über OAuth interagiert, das nicht für die Befehlszeile optimiert ist Anwendungen. Um dies zu umgehen, haben Sie einen lokalen HTTP-Server als Umleitungs-URI für die Autorisierung eingerichtet. Nachdem der Benutzer die Anwendung autorisiert und zum Server weitergeleitet wurde, möchten Sie den Server herunterfahren, sobald das Zugriffstoken angezeigt wurde.
Bei der Implementierung des Shutdown-Mechanismus ist ein Problem aufgetreten. Konkret führt der Aufruf von srv.Shutdown(nil) im Request-Handler (showTokenToUser) zu einem Fehler:
2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed 2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Das Problem entsteht, weil Sie rufen srv.Shutdown(nil) mehrmals auf:
Der Aufruf von srv.Shutdown, während der Server noch auf Verbindungen wartet, führt zu einer Race-Bedingung. Die Goroutine ListenAndServe() versucht, die offenen Listener und inaktiven Verbindungen zu schließen, wird jedoch durch den nachfolgenden Aufruf von Shutdown im Handler-Schließen unterbrochen. Diese Statusinkonsistenz löst die Panik aus.
Um dieses Problem zu beheben, können Sie eine von zwei Methoden verwenden:
1. Verwenden Sie context.WithCancel:
Bei diesem Ansatz erstellen Sie einen context.Context mit einer Abbruchfunktion. Der Kontext wird an die Goroutine ListenAndServe und die Handlerfunktion showTokenToUser übergeben. Wenn dem Benutzer das Zugriffstoken angezeigt wurde, rufen Sie im Handler die Abbruchfunktion auf, um den Kontext zu beenden. Die ListenAndServe-Goroutine fährt den Server ordnungsgemäß herunter, wenn der Kontext abgebrochen wird.
2. Verwenden Sie denselben Context:
Anstatt context.WithCancel aufzurufen, können Sie denselben context.Context an die ListenAndServe-Goroutine und die Handlerfunktion übergeben. Wenn das Zugriffstoken angezeigt wird, rufen Sie cancel() für den Kontext auf, was das Herunterfahren sowohl des Handlers als auch der ListenAndServe-Goroutine auslöst.
Denken Sie nach der Implementierung beider Ansätze daran, auf die Funktion srv.Shutdown zu warten muss abgeschlossen werden, bevor das Programm beendet wird.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3