JavaScripthez készült Azure Cosmos DB ügyfélkódtár – 4.0.0-s verzió
/TypeScript
Az Azure Cosmos DB egy globálisan elosztott, többmodelles adatbázis-szolgáltatás, amely dokumentum és kulcs–érték típusú, valamint széles oszlopú és gráfadatbázisokat támogat. Ez a csomag JavaScript-/TypeScript-alkalmazások számára készült az SQL API-adatbázisok és az általuk tartalmazott JSON-dokumentumok használatához:
- Cosmos DB-adatbázisok létrehozása és beállításaik módosítása
- Tárolók létrehozása és módosítása JSON-dokumentumok gyűjteményeinek tárolásához
- A tárolókban lévő elemek (JSON-dokumentumok) létrehozása, olvasása, frissítése és törlése
- Az adatbázis dokumentumainak lekérdezése SQL-szerű szintaxissal
Főbb hivatkozások:
Első lépések
Előfeltételek
Azure-előfizetés és Cosmos DB SQL API-fiók
A csomag használatához Azure-előfizetéssel és Cosmos DB-fiókkal (SQL API) kell rendelkeznie.
Ha Cosmos DB SQL API-fiókra van szüksége, az Azure Cloud Shell használatával létrehozhat egyet az Alábbi Azure CLI-paranccsal:
az cosmosdb create --resource-group <resource-group-name> --name <cosmos-database-account-name>
Vagy létrehozhat egy fiókot az Azure Portalon
NodeJS
Ez a csomag az npm-en keresztül van elosztva, amely a NodeJS-sel előre telepítve van. A Node v10-et vagy újabb verziót kell használnia.
CORS
Ha böngészőkhöz kell fejlesztenie, be kell állítania az eltérő eredetű erőforrások megosztására (CORS) vonatkozó szabályokat a Cosmos DB-fiókhoz. A csatolt dokumentumban található utasításokat követve hozzon létre új CORS-szabályokat a Cosmos DB-hez.
A csomag telepítése
npm install @azure/cosmos
Fiók hitelesítő adatainak lekérése
Szüksége lesz a Cosmos DB-fiók végpontjára és kulcsára. Ezeket megtalálhatja az Azure Portalon , vagy használhatja az alábbi Azure CLI-kódrészletet . A kódrészlet a Bash-felülethez van formázva.
az cosmosdb show --resource-group <your-resource-group> --name <your-account-name> --query documentEndpoint --output tsv
az cosmosdb keys list --resource-group <your-resource-group> --name <your-account-name> --query primaryMasterKey --output tsv
Példány létrehozása CosmosClient
A Cosmos DB-vel való interakció a CosmosClient osztály egy példányával kezdődik
const { CosmosClient } = require("@azure/cosmos");
const endpoint = "https://your-account.documents.azure.com";
const key = "<database account masterkey>";
const client = new CosmosClient({ endpoint, key });
async function main() {
// The rest of the README samples are designed to be pasted into this function body
}
main().catch((error) => {
console.error(error);
});
Az egyszerűség kedvéért a és endpoint
a key
kódot közvetlenül is belefoglaltuk a kódba, de valószínűleg olyan fájlból szeretné betölteni őket, amely nem a forráskontrollban van, például a dotenv vagy a környezeti változókból való betöltés során.
Éles környezetben a titkos kulcsokat, például a kulcsokat az Azure-ban kell tárolni, Key Vault
Fő fogalmak
Miután inicializált egy CosmosClientet, használhatja a Cosmos DB elsődleges erőforrástípusait:
Adatbázis: A Cosmos DB-fiókok több adatbázist is tartalmazhatnak. Adatbázis létrehozásakor meg kell adnia azt az API-t, amelyet használni szeretne a dokumentumaival való interakcióhoz: SQL, MongoDB, Gremlin, Cassandra vagy Azure Table. Használja az Adatbázis objektumot a tárolók kezeléséhez.
Tároló: A tároló JSON-dokumentumok gyűjteménye. A Tároló objektum metódusainak használatával elemeket hozhat létre (szúrhat be), olvashat, frissíthet és törölhet egy tárolóban .
Elem: Az elem egy tárolóban tárolt JSON-dokumentum. Minden elemnek tartalmaznia kell egy
id
kulcsot egy olyan értékkel, amely egyedileg azonosítja az elemet a tárolóban. Ha nem ad meg ,id
az SDK automatikusan létrehoz egyet.
További információ ezekről az erőforrásokról: Az Azure Cosmos-adatbázisok, -tárolók és -elemek használata.
Példák
A következő szakaszok számos kódrészletet biztosítanak, amelyek a leggyakoribb Cosmos DB-feladatokat fedik le, többek között:
- Adatbázis létrehozása
- Tároló létrehozása
- Partíciókulcsok használata
- Elemek beszúrása
- Dokumentumok lekérdezése
- Elem olvasása
- Elem törlése
- CRUD a tárolón hierarchikus partíciókulccsal
Adatbázis létrehozása
A CosmosClient hitelesítése után a fiók bármely erőforrásával dolgozhat. Az alábbi kódrészlet létrehoz egy NOSQL API-adatbázist.
const { database } = await client.databases.createIfNotExists({ id: "Test Database" });
console.log(database.id);
Tároló létrehozása
Ez a példa egy alapértelmezett beállításokkal rendelkező tárolót hoz létre
const { container } = await database.containers.createIfNotExists({ id: "Test Database" });
console.log(container.id);
Partíciókulcsok használata
Ez a példa a támogatott partíciókulcsok különböző típusait mutatja be.
await container.item("id", "1").read(); // string type
await container.item("id", 2).read(); // number type
await container.item("id", true).read(); // boolean type
await container.item("id", {}).read(); // None type
await container.item("id", undefined).read(); // None type
await container.item("id", null).read(); // null type
Ha a partíciókulcs egyetlen értékből áll, akkor konstansértékként vagy tömbként adható meg.
await container.item("id", "1").read();
await container.item("id", ["1"]).read();
Ha a partíciókulcs több értékből áll, tömbként kell megadni.
await container.item("id", ["a", "b"]).read();
await container.item("id", ["a", 2]).read();
await container.item("id", [{}, {}]).read();
await container.item("id", ["a", {}]).read();
await container.item("id", [2, null]).read();
Elemek beszúrása
Ha elemeket szeretne beszúrni egy tárolóba, adja át az adatokat tartalmazó objektumot az Items.upsert fájlnak. Az Azure Cosmos DB szolgáltatáshoz minden elemnek rendelkeznie kell egy id
kulccsal. Ha nem ad meg egyet, az SDK automatikusan létrehoz egy értéket id
.
Ez a példa több elemet szúr be a tárolóba
const cities = [
{ id: "1", name: "Olympia", state: "WA", isCapitol: true },
{ id: "2", name: "Redmond", state: "WA", isCapitol: false },
{ id: "3", name: "Chicago", state: "IL", isCapitol: false }
];
for (const city of cities) {
await container.items.create(city);
}
Elem olvasása
Ha egyetlen elemet szeretne beolvasni egy tárolóból, használja az Item.read parancsot. Ez egy kevésbé költséges művelet, mint az SQL használata a lekérdezéséhez.id
await container.item("1", "1").read();
CRUD a tárolón hierarchikus partíciókulccsal
Tároló létrehozása hierarchikus partíciókulccsal
const containerDefinition = {
id: "Test Database",
partitionKey: {
paths: ["/name", "/address/zip"],
version: PartitionKeyDefinitionVersion.V2,
kind: PartitionKeyKind.MultiHash,
},
}
const { container } = await database.containers.createIfNotExists(containerDefinition);
console.log(container.id);
Elem beszúrása a következőként definiált hierarchikus partíciókulccsal: ["/name", "/address/zip"]
const item = {
id: 1,
name: 'foo',
address: {
zip: 100
},
active: true
}
await container.items.create(item);
Egyetlen elem beolvasása egy tárolóból a következőként definiált hierarchikus partíciókulccsal: ["/name", "/address/zip"],
await container.item("1", ["foo", 100]).read();
Elem lekérdezése hierarchikus partíciókulccsal a következőként definiált hierarchikus partíciókulccsal: ["/name", "/address/zip"],
const { resources } = await container.items
.query("SELECT * from c WHERE c.active = true", {
partitionKey: ["foo", 100],
})
.fetchAll();
for (const item of resources) {
console.log(`${item.name}, ${item.address.zip} `);
}
Elem törlése
Elemek tárolóból való törléséhez használja az Item.delete parancsot.
// Delete the first item returned by the query above
await container.item("1").delete();
Az adatbázis lekérdezése
A Cosmos DB SQL API-adatbázisok támogatják a tároló elemeinek az Items.query használatával történő lekérdezését SQL-szerű szintaxissal:
const { resources } = await container.items
.query("SELECT * from c WHERE c.isCapitol = true")
.fetchAll();
for (const city of resources) {
console.log(`${city.name}, ${city.state} is a capitol `);
}
Paraméteres lekérdezések végrehajtásához adjon át egy objektumot, amely tartalmazza a paramétereket és azok értékeit az Items.querynek:
const { resources } = await container.items
.query({
query: "SELECT * from c WHERE c.isCapitol = @isCapitol",
parameters: [{ name: "@isCapitol", value: true }]
})
.fetchAll();
for (const city of resources) {
console.log(`${city.name}, ${city.state} is a capitol `);
}
További információ a Cosmos DB-adatbázisok SQL API-val történő lekérdezéséről: Azure Cosmos DB-adatok lekérdezése SQL-lekérdezésekkel.
Változáscsatorna lekérési modelljének módosítása
A változáscsatorna lekérhető egy partíciókulcshoz, egy adatcsatornatartományhoz vagy egy teljes tárolóhoz.
A változáscsatorna feldolgozásához hozzon létre egy példányt a következőből ChangeFeedPullModelIterator
: . A létrehozásakor ChangeFeedPullModelIterator
meg kell adnia egy kötelező changeFeedStartFrom
értéket a ChangeFeedIteratorOptions
fájlon belül, amely a módosítások olvasásának kezdőpozícióját és azt az erőforrást (partíciókulcsot vagy FeedRange-t) tartalmazza, amelyhez a módosításokat le kell kérni. A(z) használatával megadhatja maxItemCount
ChangeFeedIteratorOptions
az egy oldalonként fogadott elemek maximális számát.
Megjegyzés: Ha nincs changeFeedStartFrom
megadva érték, akkor a changefeed egy teljes tárolóra lesz lekérve a Now() fájlból.
A változáscsatornának négy kezdőpozíciója van:
Beginning
// Signals the iterator to read changefeed from the beginning of time.
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Beginning();
}
const iterator = container.getChangeFeedIterator(options);
Time
// Signals the iterator to read changefeed from a particular point of time.
const time = new Date("2023/09/11") // some sample date
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Time(time);
}
Now
// Signals the iterator to read changefeed from this moment onward.
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Now();
}
Continuation
// Signals the iterator to read changefeed from a saved point.
const continuationToken = "some continuation token recieved from previous request";
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Continuation(continuationToken);
}
Íme egy példa egy partíciókulcs változáscsatornájának beolvasására
const partitionKey = "some-partition-Key-value";
const options = {
changeFeedStartFrom: ChangeFeedStartFrom.Beginning(partitionKey),
};
const iterator = container.items.getChangeFeedIterator(options);
while (iterator.hasMoreResults) {
const response = await iterator.readNext();
// process this response
}
Mivel a változáscsatorna gyakorlatilag az összes jövőbeli írást és frissítést magában foglaló elemek végtelen listája, a értéke hasMoreResults
mindig true
. Amikor megpróbálja elolvasni a változáscsatornát, és nincsenek elérhető új módosítások, állapotú NotModified
választ kap.
Részletesebb használati irányelvek és példák a változáscsatornára itt találhatók.
Hibakezelés
Az SDK különböző típusú hibákat generál, amelyek egy művelet során fordulhatnak elő.
ErrorResponse
akkor jelenik meg, ha egy művelet válasza =400 hibakódot >ad vissza.TimeoutError
akkor lesz eldobva, ha a megszakítást időtúllépés miatt belsőleg hívják meg.AbortError
akkor lesz eldobva, ha a felhasználó által átadott jel okozta a megszakítást.RestError
a rendszer a mögöttes rendszerhívás hálózati problémák miatti hibája esetén jelenik meg.- A devDependencies által létrehozott hibák. Például:
@azure/identity
csomag dobhatCredentialUnavailableError
.
Az alábbi példa a , , TimeoutError
AbortError
és RestError
típusú ErrorResponse
hibák kezelésére mutat be példát.
try {
// some code
} catch (err) {
if (err instanceof ErrorResponse) {
// some specific error handling.
} else if (err instanceof RestError) {
// some specific error handling.
}
// handle other type of errors in similar way.
else {
// for any other error.
}
}
Fontos, hogy megfelelően kezelje ezeket a hibákat, hogy az alkalmazás zökkenőmentesen helyreálljon a hibákból, és továbbra is a várt módon működjön. Ezekről a hibákról és azok lehetséges megoldásairól itt talál további információt.
Hibaelhárítás
Általános kérdések
Amikor a szolgáltatás által visszaadott Cosmos DB-hibákkal kommunikál, ugyanazoknak a HTTP-állapotkódoknak felelnek meg, amelyeket a REST API-kérések esetében ad vissza:
HTTP-állapotkódok az Azure Cosmos DB-hez
Ütközések
Ha például olyan elemet id
próbál létrehozni, amely már használatban van a Cosmos DB-adatbázisban, 409
a rendszer hibát ad vissza, jelezve az ütközést. Az alábbi kódrészletben a rendszer a hibát a kivétel elfogásával és a hibával kapcsolatos további információk megjelenítésével kezeli.
try {
await containers.items.create({ id: "existing-item-id" });
} catch (error) {
if (error.code === 409) {
console.log("There was a conflict with an existing item");
}
}
Fordítás
Az Azure SDK-k a Node.jsES5 JavaScript-szintaxisát és LTS-verzióit támogatják. Ha támogatásra van szüksége a korábbi JavaScript-futtatókörnyezetekhez, például az Internet Explorerhez vagy a Node 6-hoz, a buildelési folyamat részeként át kell lefordítania az SDK-kódot.
Átmeneti hibák kezelése újrapróbálkozásokkal
A Cosmos DB használata során átmeneti hibákat tapasztalhat, amelyeket a szolgáltatás által kényszerített sebességkorlátok vagy más átmeneti problémák, például a hálózati kimaradások okoznak. Az ilyen típusú hibák kezelésével kapcsolatos információkért lásd: Újrapróbálkozási minta a felhőtervezési minták útmutatójában és a kapcsolódó áramkör-megszakító minta.
Naplózás
A naplózás engedélyezése segíthet a hibákról szóló hasznos információk feltárásában. A HTTP-kérések és válaszok naplójának megtekintéséhez állítsa a környezeti változót a AZURE_LOG_LEVEL
értékre info
. A naplózás futásidőben is engedélyezhető, ha setLogLevel
meghívja a következőt: @azure/logger
. A használat AZURE_LOG_LEVEL
során győződjön meg arról, hogy be van állítva a naplózási kódtár inicializálása előtt.
Ideális esetben adja át a parancssoron keresztül, ha kódtárakat használ, például dotenv
ellenőrizze, hogy az ilyen kódtárak inicializálva vannak-e a naplózás előtt.
const { setLogLevel } = require("@azure/logger");
setLogLevel("info");
A naplók engedélyezésére vonatkozó részletesebb útmutatásért tekintse meg a @azure/logger csomag dokumentációt.
Diagnosztika
A Cosmos Diagnostics szolgáltatás továbbfejlesztett betekintést nyújt az összes ügyfélműveletbe. A rendszer hozzáad egy CosmosDiagnostics objektumot az összes ügyfélművelet válaszához. Mint
- Pontkeresési művelet reponse –
item.read()
, ,container.create()
database.delete()
- Lekérdezési művelet reponse -
queryIterator.fetchAll()
, - Tömeges és Batch-műveletek –
item.batch()
- Hiba-/kivételválasz-objektumok.
A rendszer hozzáad egy CosmosDiagnostics objektumot az összes ügyfélművelet válaszához. 3 Cosmos diagnosztikai szint, információ, hibakeresés és hibakeresés nem biztonságos. Ahol csak az éles rendszerekhez szánt információk, és a hibakeresés és a hibakeresés nem biztonságos, a fejlesztés és a hibakeresés során kell használni, mivel jelentősen magasabb erőforrásokat használnak fel. A Cosmos diagnosztikai szintje kétféleképpen állítható be
- Programozott módon
const client = new CosmosClient({ endpoint, key, diagnosticLevel: CosmosDbDiagnosticLevel.debug });
- Környezeti változók használata. (A Környezeti változó által beállított diagnosztikai szint nagyobb prioritással rendelkezik, mint az ügyfélbeállításokon keresztüli beállítás.)
export AZURE_COSMOSDB_DIAGNOSTICS_LEVEL="debug"
A Cosmos Diagnostic három tagból áll
ClientSideRequestStatistics Típusa: Összesíti a diagnosztikai adatokat, beleértve a metaadatok keresését, az újrapróbálkozásokat, a felkeresett végpontokat, valamint a kérelem- és válaszstatisztikákat, például a hasznos adatok méretét és időtartamát. (mindig gyűjtik, éles rendszerekben használható.)
DiagnosticNode: Faszerű szerkezet, amely részletes diagnosztikai információkat rögzít. Hasonló a
har
böngészőkben található felvételhez. Ez a funkció alapértelmezés szerint le van tiltva, és csak nem éles környezetek hibakeresésére szolgál. (diagnosztikai szinten gyűjtött hibakeresés és nem biztonságos hibakeresés)ClientConfig: Rögzíti az ügyfél konfigurációs beállításaival kapcsolatos alapvető információkat az ügyfél inicializálása során. (diagnosztikai szinten gyűjtött hibakeresés és nem biztonságos hibakeresés)
Győződjön meg arról, hogy soha nem állítja be a diagnosztikai szintet debug-unsafe
éles környezetben, mivel ez a szint CosmosDiagnostics
rögzíti a kérések és válaszok hasznos adatait, és ha úgy dönt, hogy naplózza (alapértelmezés szerint a szint naplózza @azure/loggerverbose
). Ezek a hasznos adatok rögzítve lehetnek a naplós fogadókban.
Diagnosztika felhasználása
- Mivel
diagnostics
az összes válaszobjektumhoz hozzá van adva. Az alábbiak szerint programozott módon férhet hozzáCosmosDiagnostic
.
// For point look up operations
const { container, diagnostics: containerCreateDiagnostic } =
await database.containers.createIfNotExists({
id: containerId,
partitionKey: {
paths: ["/key1"],
},
});
// For Batch operations
const operations: OperationInput[] = [
{
operationType: BulkOperationType.Create,
resourceBody: { id: 'A', key: "A", school: "high" },
},
];
const response = await container.items.batch(operations, "A");
// For query operations
const queryIterator = container.items.query("select * from c");
const { resources, diagnostics } = await queryIterator.fetchAll();
// While error handling
try {
// Some operation that might fail
} catch (err) {
const diagnostics = err.diagnostics
}
- A használatával is bejelentkezhet
@azure/logger
diagnostics
, a diagnosztikát mindig a szintenverbose
naplózza a rendszer@azure/logger
. Ha tehát a diagnosztikai szintet a vagydebug-unsafe
@azure/logger
értékredebug
verbose
diagnostics
állítja, a rendszer naplózza.
Következő lépések
További mintakód
Az SDK GitHub-adattárában számos minta érhető el. Ezek a minták példakódot biztosítanak a Cosmos DB használata során gyakran előforduló további forgatókönyvekhez:
- Adatbázis-műveletek
- Tárolóműveletek
- Elemműveletek
- Indexelés konfigurálása
- Tároló változáscsatorna olvasása
- Tárolt eljárások
- Adatbázis/tároló átviteli sebesség beállításainak módosítása
- Többrégiós írási műveletek
Korlátozások
Az alábbi funkciók jelenleg nem támogatottak. Alternatív lehetőségekért tekintse meg az alábbi Kerülő megoldások szakaszt.
Adatsíkra vonatkozó korlátozások:
- A COUNT függvénnyel rendelkező lekérdezések EGY DISTINCT-albekérdezésből
- Közvetlen TCP-mód elérése
- A partíciók közötti lekérdezések , például a rendezés, a számolás és a különböző elemek összesítése nem támogatja a folytatási jogkivonatokat. Streamelhető lekérdezések, például SELECT * FROM WHERE , a folytatási jogkivonatok támogatása. A nem streamelhető lekérdezések folytatási jogkivonat nélkül történő végrehajtásához tekintse meg a "Kerülő megoldás" című szakaszt.
- Változáscsatorna: Processzor
- Változáscsatorna: Több partíció kulcsértékeinek olvasása
- Változáscsatorna lekérési modell minden verziója és törlési mód #27058
- Változáscsatorna lekéréses modell támogatása részleges hierarchikus partíciókulcsokhoz #27059
- Keresztpartíciós ORDER BY vegyes típusok esetén
- CollectionSizeUsage, DatabaseUsage és DocumentUsage metrikák lekérése
- Térinformatikai index létrehozása
- Automatikus skálázás átviteli sebességének frissítése
Vezérlősík korlátozásai:
Kerülő megoldások
Folytatási jogkivonat partíciók közötti lekérdezésekhez
A particionálások közötti lekérdezéseket folytatási jogkivonat-támogatással, side car minta használatával érheti el. Ez a minta azt is lehetővé teheti, hogy az alkalmazások heterogén összetevőkből és technológiákból álljanak.
Nem stremable keresztpartíciós lekérdezés végrehajtása
Ha folytatási jogkivonatok használata nélkül szeretne nem streamelhető lekérdezéseket végrehajtani, létrehozhat egy lekérdezési iterátort a szükséges lekérdezési specifikációval és beállításokkal. Az alábbi mintakód bemutatja, hogyan használhat lekérdezési iterátort az összes eredmény lekéréséhez folytatási jogkivonat nélkül:
const querySpec = {
query: "SELECT * FROM c WHERE c.status = @status",
parameters: [{ name: "@status", value: "active" }],
};
const queryOptions = {
maxItemCount: 10, // maximum number of items to return per page
enableCrossPartitionQuery: true,
};
const querIterator = await container.items.query(querySpec, queryOptions);
while (querIterator.hasMoreResults()) {
const { resources: result } = await querIterator.fetchNext();
//Do something with result
}
Ez a módszer streamelhető lekérdezésekhez is használható.
Vezérlősík-műveletek
A vezérlősík nem támogatott korlátaihoz általában az Azure Portalt, az Azure Cosmos DB erőforrás-szolgáltató RESTAPI-t, az Azure CLI-t vagy a PowerShellt használhatja.
További dokumentáció
A Cosmos DB szolgáltatás részletesebb dokumentációját az Azure Cosmos DB dokumentációjában találja a docs.microsoft.com.
Hasznos hivatkozások
- Bevezetés az Azure Cosmos DB-e
- Első lépések
- Oktatóanyag
- Példák
- Az Azure Cosmos DB Szolgáltatás erőforrásmodelljének bemutatása
- Az Azure Cosmos DB Service SQL API bemutatása
- Particionálás
- API-dokumentáció
Közreműködés
Ha hozzá szeretne járulni ehhez a kódtárhoz, olvassa el a közreműködői útmutatót , amelyből többet is megtudhat a kód összeállításáról és teszteléséről.
Azure SDK for JavaScript