Die__Serve
Funktion wird verwendet, um Http-Dienst, TCP-Dienst und Websocket-Dienst (basierend auf Http-Protokoll) zu erstellen.
Gibt eine Zeichenfolge zurück, die die IP-Adresse und den Port des erstellten Dienstes aufzeichnet.127.0.0.1:8088
, [::]:8089
.
String
__Serve (ServeURI, Handler) __Serve ((serveURI, Handler,...args)
DieserveURI
Parameter wird verwendet, um das Protokoll, die IP-Adresse, den Port und andere Einstellungen der Dienstbindung zu konfigurieren, wiehttp://0.0.0.0:8088?gzip=true
, d. h.http://:8088?gzip=true
.
serveURI
Einstellung von Parametern wietcp://127.0.0.1:6666?tls=true
Sie können z. B. Zertifikate und private Schlüssel hinzufügentls=true&cert_pem=xxxx&cert_key_pem=xxxx
.serveURI
Einstellungen von Parametern wiehttp://127.0.0.1:6666?gzip=true
; Sie können Komprimierungseinstellungen einstellen:gzip=true
- Ich weiß.
DieserveURI
Parameter wird für Https verwendet, wiehttps://127.0.0.1:6666?tls=true&gzip=true
; Sie können hinzufügencert_pem
undcert_key_pem
Parameter zum Laden des Zertifikats.ServiceURI
wahr
String
Diehandler
Der Parameter wird verwendet, um in der Routing-Verarbeitungsfunktion (Http-Protokoll), der Nachrichtenverarbeitungsfunktion (TCP-Protokoll) und der Stream-Verarbeitungsfunktion (Websocket) zu übergeben.
Die von dem Parameter übermittelte Rückruffunktionhandler
kann mehrere Parameter definieren, der erste Parameter ist das ctx-Objekt (Kontextobjekt).
Handler
wahr
Funktion
Der tatsächliche Parameter der Rückruffunktion wird als Parameter übergebenhandler
Es kann mehrere Parameter geben.arg
, zum Beispiel:
__Serve("http://:8088", function(ctx, a, b, c) {
Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)
Die Parameter1
, 2
, 3
Sie ist bei der Anrufung der__Serve()
Funktion entsprechen den Parameterna
, b
, c
in der Rückruffunktion übergeben.
Arg falsche String, Zahl, bool, Objekt, Array, Funktion, Nullwert und andere vom System unterstützte Typen
function main() {
let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
let path = ctx.path()
if (path == "/") {
ctx.write(JSON.stringify({
path: ctx.path(),
method: ctx.method(),
headers: ctx.headers(),
cookie: ctx.header("Cookie"),
remote: ctx.remoteAddr(),
query: ctx.rawQuery()
}))
} else if (path == "/tickers") {
let ret = exchange.GetTickers()
if (!ret) {
ctx.setStatus(500)
ctx.write(GetLastError())
} else {
ctx.write(JSON.stringify(ret))
}
} else if (path == "/wss") {
if (ctx.upgrade("websocket")) { // upgrade to websocket
while (true) {
let r = ctx.read(10)
if (r == "") {
break
} else if (r) {
if (r == "ticker") {
ctx.write(JSON.stringify(exchange.GetTicker()))
} else {
ctx.write("not support")
}
}
}
Log("websocket closed", ctx.remoteAddr())
}
} else {
ctx.setStatus(404)
}
})
let echoServer = __Serve("tcp://:8089", function (ctx) {
Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
while (true) {
let d = ctx.read()
if (!d) {
break
}
ctx.write(d)
}
Log("connect closed")
})
Log("http serve on", httpServer, "tcp serve on", echoServer)
for (var i = 0; i < 5; i++) {
if (i == 2) {
// test Http
var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
Log("retHttp:", retHttp)
} else if (i == 3) {
// test TCP
var tcpConn = Dial("tcp://127.0.0.1:8089")
tcpConn.write("Hello TCP Server")
var retTCP = tcpConn.read()
Log("retTCP:", retTCP)
} else if (i == 4) {
// test Websocket
var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
wsConn.write("ticker")
var retWS = wsConn.read(1000)
Log("retWS:", retWS)
// no depth
wsConn.write("depth")
retWS = wsConn.read(1000)
Log("retWS:", retWS)
}
Sleep(1000)
}
}
# Unsupported
// Unsupported
Websocket
Sie können einen Routing-Zweig in den Pfad setzen und den Implementierungscode fürWebsocket
Sie können sich auf den Mustercode in diesem Abschnitt beziehen.Die von dem Parameter übermittelte Rückruffunktionhandler
erhält einectx
Diectx
Parameter ist ein Kontextobjekt, das zur Erfassung und Schreibung von Daten mit folgenden Methoden verwendet wird:
- ctx.proto ((()
Wird auf das Http/TCP-Protokoll angewendet, gibt den Protokollnamen zurück, wenn er aufgerufen wird.HTTP/1.1
, tcp
- Ich weiß.
- ctx.host()
Anwendet auf das HTTP-Protokoll, gibt es Hostinformationen zurück, wenn IP-Adresse und Port aufgerufen werden.
- ctx.path (siehe unten)
Wird auf das HTTP-Protokoll angewendet, gibt er den Anforderungspfad zurück, wenn er aufgerufen wird.
- ctx.query (Schlüssel)
Wird auf das HTTP-Protokoll angewendet, gibt den Wert zurück, der dem Schlüssel in der Abfrage in der Anfrage entspricht, wenn sie aufgerufen wird.http://127.0.0.1:8088?num=123
, und die von dem Parameter übermittelte Funktion für die Rückrufverarbeitunghandler
Erträge"123"
Wann?ctx.query("num")
ist genannt.
- ctx.rawQuery()
Wird auf das Http-Protokoll angewendet, wird bei Aufruf die ursprüngliche Abfrage in der Anfrage zurückgegeben (die Abfrage der Http-Anfrage).
- ctx.Header (siehe unten)
Wird auf das Http-Protokoll angewendet und gibt bei Aufruf die Anforderungsheader-Informationen in der Anfrage zurück.
- ctx.header (Schlüssel)
Wird auf das HTTP-Protokoll angewendet, gibt es den Wert eines Schlüssels in der angegebenen Anforderungskopfzeile zurück, wenn er aufgerufen wird.User-Agent
in den Überschriften des vorliegenden Antrags:ctx.header("User-Agent")
- Ich weiß.
- ctx.Methode ((()
Wird auf das Http-Protokoll angewendet, gibt die Anforderungsmethode zurück, wenn sie aufgerufen wird, wie z. B.GET
, POST
, usw.
- ctx.body (siehe unten)
Wird auf die POST-Anfrage des HTTP-Protokolls angewendet und gibt den Körper der Anfrage zurück, wenn er aufgerufen wird.
- ctx.setHeader (Schlüssel, Wert)
Wird auf das HTTP-Protokoll angewendet, um die Anfrageheader-Informationen der Antwortnachricht festzulegen.
- ctx.setStatus (Code)
Für das Http-Protokoll wird der Statuscode der Http-Nachricht gesetzt. Normalerweise wird der Statuscode am Ende des Routing-Branches gesetzt. Der Standardwert ist 200.
- ctx.remoteAddr()
Wird auf das HTTP/TCP-Protokoll angewendet, gibt die Adresse des Remote-Clients und den Port in der Anfrage zurück, wenn er aufgerufen wird.
- ctx.localAddr ((()
Wird auf das HTTP/TCP-Protokoll angewendet, gibt die lokale Adresse und den Port des Dienstes zurück, wenn er aufgerufen wird.
- ctx.upgrade ((ctx
Kontextobjekt zum Websocket-Protokoll; Gibt einen Boolean-Wert (true) zurück, wenn der Switch erfolgreich ist, und einen Boolean-Wert (false), wenn er fehlschlägt.
- ctx.read ((timeout_ms)
Wird auf Websocket-Protokollimplementierung/TCP-Protokoll basierend auf HTTP-Protokoll angewendet, liest Daten von Websocket-Verbindung und TCP-Verbindung.read
Sie können den Timeout-Parameter angeben.timeout_ms
in Millisekunden.
- ctx.write (s)
Wird auf das HTTP/TCP-Protokoll angewendet, verwendet, um String-Daten zu schreiben.JSON.stringify()
Das JSON-Objekt in eine Zeichenkette zu kodieren und dann zu schreiben.WebSocket
Protokoll, Sie können diese Methode verwenden, um die verschlüsselte Zeichenfolge an den Client weiterzugeben.
Das ist eine sehr schwierige Aufgabe.
EventLoop _G