Streaming-Helfer
Der Streaming-Helfer bietet Methoden für Streaming-Antworten.
Import
import { Hono } from 'hono'
import { stream, streamText, streamSSE } from 'hono/streaming'stream()
Gibt eine einfache Streaming-Antwort als Response-Objekt zurück.
app.get('/stream', (c) => {
return stream(c, async (stream) => {
// Write a process to be executed when aborted.
stream.onAbort(() => {
console.log('Aborted!')
})
// Write a Uint8Array.
await stream.write(new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]))
// Pipe a readable stream.
await stream.pipe(anotherReadableStream)
})
})streamText()
Gibt eine Streaming-Antwort mit den Headern Content-Type: text/plain, Transfer-Encoding: chunked und X-Content-Type-Options: nosniff zurück.
app.get('/streamText', (c) => {
return streamText(c, async (stream) => {
// Write a text with a new line ('\n').
await stream.writeln('Hello')
// Wait 1 second.
await stream.sleep(1000)
// Write a text without a new line.
await stream.write(`Hono!`)
})
})Achtung
Wenn du eine Anwendung für Cloudflare Workers entwickelst, funktioniert Streaming in Wrangler möglicherweise nicht richtig. Füge in diesem Fall Identity als Wert für den Header Content-Encoding hinzu.
app.get('/streamText', (c) => {
c.header('Content-Encoding', 'Identity')
return streamText(c, async (stream) => {
// ...
})
})streamSSE()
Ermöglicht das einfache Streamen von Server-Sent Events (SSE).
const app = new Hono()
let id = 0
app.get('/sse', async (c) => {
return streamSSE(c, async (stream) => {
while (!stream.aborted) {
const message = `It is ${new Date().toISOString()}`
await stream.writeSSE({
data: message,
event: 'time-update',
id: String(id++),
})
await stream.sleep(1000)
}
})
})Fehlerbehandlung
Das dritte Argument des Streaming-Helfers ist ein Fehler-Handler. Dieses Argument ist optional. Wenn du es nicht angibst, wird der Fehler als Konsolenfehler ausgegeben.
app.get('/stream', (c) => {
return stream(
c,
async (stream) => {
// Write a process to be executed when aborted.
stream.onAbort(() => {
console.log('Aborted!')
})
// Write a Uint8Array.
await stream.write(
new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])
)
// Pipe a readable stream.
await stream.pipe(anotherReadableStream)
},
(err, stream) => {
stream.writeln('An error occurred!')
console.error(err)
}
)
})Der Stream wird nach Ausführung der Callbacks automatisch geschlossen.
Achtung
Wenn die Callback-Funktion des Streaming-Helfers einen Fehler auslöst, wird das Ereignis onError von Hono nicht ausgelöst.
onError ist ein Hook, der Fehler vor dem Senden der Antwort behandelt und die Antwort überschreibt. Wenn die Callback-Funktion ausgeführt wird, hat der Stream jedoch bereits begonnen und kann nicht mehr überschrieben werden.