

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 撰寫啟用回應串流的 Lambda 函數
<a name="config-rs-write-functions"></a>

撰寫回應串流函數的處理常式不同於典型的處理常式模式。撰寫串流函數時，請務必執行下列動作：
+ 使用 `awslambda.streamifyResponse()` 裝飾項目包裝函式。`awslambda` 全域物件由 Lambda 的 Node.js 執行時期環境提供。
+ 從容地結束串流，以確保所有資料處理都完成。

## 設定處理常式函數以串流回應
<a name="config-rs-write-functions-handler"></a>

為了向執行期指示 Lambda 應該串流函數的回應，您必須使用 `streamifyResponse()` 裝飾項目包裝函數。這會通知執行期使用適當的邏輯路徑來串流回應，並讓函數串流回應。

`streamifyResponse()` 裝飾項目接受的函數可接受以下參數：
+ `event` – 提供函數 URL 調用事件的相關資訊，例如 HTTP 方法、查詢參數和請求內文。
+ `responseStream` – 提供可寫入的串流。
+ `context` – 提供方法和屬性，以及有關調用、函數以及執行環境的資訊。

`responseStream` 物件是 [Node.js `writableStream`](https://nodesource.com/blog/understanding-streams-in-nodejs/)。與任何此類串流一樣，您應該使用 `pipeline()` 方法。

**注意**  
`awslambda` 全域物件由 Lambda 的 Node.js 執行時期自動提供，不需要匯入。

**Example 啟用回應串流的處理常式**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

  await pipeline(requestStream, responseStream);
});
```

雖然 `responseStream` 提供寫入串流的 `write()` 方法，但仍建議您盡可能使用 [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback)。使用 `pipeline()` 可確保可寫入的串流不會被更快的可讀串流所淹沒。

## 結束串流
<a name="config-rs-write-functions-end"></a>

請確保在處理常式傳回之前正確結束串流。`pipeline()` 方法會自動處理這種情形。

對於其他使用案例，請呼叫 `responseStream.end()` 方法以正確結束串流。此方法發出訊號，表示不應向串流寫入更多資料。如果您使用 `pipeline()` 或 `pipe()` 寫入串流，則不需要此方法。

從 Node.js 24 開始，Lambda 不會在處理常式傳回或回應串流結束之後，再等待未解決的承諾完成。如果您的函數依賴其他非同步操作，例如計時器或擷取，您應該在處理常式中`await`執行這些操作。

**Example 使用 pipeline() 結束串流的範例**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example 未使用 pipeline() 結束串流的範例**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```