串流輔助工具
串流輔助工具提供串流回應的方法。
匯入
ts
import { Hono } from 'hono'
import { stream, streamText, streamSSE } from 'hono/streaming'
stream()
它會以 Response
物件形式返回一個簡單的串流回應。
ts
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()
它返回一個具有 Content-Type:text/plain
、Transfer-Encoding:chunked
和 X-Content-Type-Options:nosniff
標頭的串流回應。
ts
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!`)
})
})
警告
如果您正在為 Cloudflare Workers 開發應用程式,則串流可能無法在 Wrangler 上正常運作。如果是這樣,請為 Content-Encoding
標頭新增 Identity
。
ts
app.get('/streamText', (c) => {
c.header('Content-Encoding', 'Identity')
return streamText(c, async (stream) => {
// ...
})
})
streamSSE()
它可讓您無縫串流伺服器發送事件 (SSE)。
ts
const app = new Hono()
let id = 0
app.get('/sse', async (c) => {
return streamSSE(c, async (stream) => {
while (true) {
const message = `It is ${new Date().toISOString()}`
await stream.writeSSE({
data: message,
event: 'time-update',
id: String(id++),
})
await stream.sleep(1000)
}
})
})
錯誤處理
串流輔助工具的第三個參數是一個錯誤處理函式。此參數是選用的,如果您未指定它,則錯誤將輸出為控制台錯誤。
ts
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)
}
)
})
在執行回呼函式後,串流將自動關閉。
警告
如果串流輔助工具的回呼函式拋出錯誤,則不會觸發 Hono 的 onError
事件。
onError
是一個在傳送回應之前處理錯誤並覆蓋回應的勾點。但是,當執行回呼函式時,串流已經開始,因此無法覆蓋它。