Node.js에서 CosmosDB 쿼리 연속 토큰 검색

Valo의 내부 도구 중 하나를 위해 프로젝트 현지화를 관리하기 위한 포털을 만들고 있습니다. 포털 자체는 정적 웹 사이트로 생성되고 Azure Static Web App에서 호스팅됩니다. Azure Static Web Apps의 장점은 호스팅 및 Azure Functions 생성 기능과 함께 제공된다는 것입니다.

포털은 지역화 데이터를 관리하기 위해 Azure Functions를 사용합니다. 처음에는 Azure Table Storage로 프로젝트를 만들기 시작했지만 몇 가지 제한 사항(속도, 쿼리, 페이징)을 곧 발견했습니다. 아키텍처를 다시 생각할 때 처음에는 Azure Search와 테이블 저장소의 조합을 수행하고 싶었습니다. 가장 큰 문제는 현지화 스키마가 지속적으로 변경된다는 것입니다. 검색 스키마를 조정할 수 있지만 대부분의 경우 최적이 아닌 인덱스를 다시 만들어야 합니다.

Info : Read more about updating Azure Search index.



또 다른 접근 방식은 Azure Cosmos DB로 이동하는 것이지만 가격표가 함께 제공됩니다. free tier 이 있지만 할인만 제공합니다. 더 많이 사용하면 사용량에 대한 비용을 지불하기 시작합니다.

올해 초 빌드에서 그들은 여름에 프리뷰로 출시되는 서버리스 계층도 있을 것이라고 발표했습니다. 좋은 소식은 이제 이 계층을 사용할 수 있고 내 앱에 대한 요구 사항에 적합하다는 것입니다.

즉, 개발을 시작했습니다. 먼저 Azure Table Storage에서 Cosmos DB로 내 콘텐츠를 푸시했습니다. 좋습니다. 데이터를 검색하기 위해 Azure Functions를 만들기 시작했습니다. 우리는 +2000 키에 대해 이야기했기 때문에 일부 페이징을 구현해야 했고 다른 문제를 우연히 발견했습니다. Cosmos DB, 연속 토큰은 .NET 및 Java SDK에 대해서만 지원되었습니다.

Info : I use Node.js (TypeScript) straightforward, I like to work with TypeScript/JavaScript, and Azure Static Web Apps only supports TS/JS functions in the preview.



Node.js의 연속 토큰



Node.js 설명서를 따르면 모든 항목을 검색하는 다음 코드 스니펫이 표시됩니다.

const querySpec = { query: "SELECT * from c" };
const { resources: items } = await container.items.query(querySpec).fetchAll();

fetchAll() 를 사용하는 대신 fetchNext() 도 얻었습니다. 이 메서드는 피드에서 다음 배치를 검색합니다. 옵션으로 continuationToken 를 제공할 수 있습니다. 문제는 이 토큰이 항상 null 이라는 것입니다. 응답 헤더를 확인하면 다음 정보만 표시됩니다.

const querySpec = { query: "SELECT * from c" };
const resources = await container.items.query(querySpec).fetchNext();


Cosmos DB 쿼리의 헤더

쿼리 옵션을 살펴보았을 때 쿼리 옵션에 PartitionKey를 제공하면 더 많은 헤더가 반환된다는 것을 알았습니다.

반환된 연속 토큰

헤더에 x-ms-continuation 값이 있는 continuationToken 헤더도 있습니다.

코드에서 사용하는 방법은 다음과 같습니다.

const results = await container.items.query(querySpec, {
  maxItemCount: 20,
  partitionKey: "category",
  continuationToken
}).fetchNext();

return {
  items: results.resources,
  nextPageToken: results.continuationToken
};


좋은 웹페이지 즐겨찾기