Příručka pro vývojáře služby Azure Functions Node.js
Tento průvodce představuje úvod do vývoje azure Functions pomocí JavaScriptu nebo TypeScriptu. V článku se předpokládá, že už jste si přečetli příručku pro vývojáře azure Functions.
Důležité
Obsah tohoto článku se změní na základě vašeho výběru programovacího modelu Node.js v selektoru v horní části této stránky. Zvolená verze by se měla shodovat s verzí @azure/functions
balíčku npm, který používáte ve své aplikaci. Pokud tento balíček nemáte ve svém package.json
seznamu , výchozí hodnota je v3. Další informace o rozdílech mezi v3 a v4 najdete v průvodci migrací.
Jako vývojář Node.js vás může zajímat také jeden z následujících článků:
Začínáme | Koncepty | Výukový program s asistencí |
---|---|---|
Důležité informace
- Programovací model Node.js by neměl být zaměňován s modulem runtime Azure Functions:
- Programovací model: Definuje způsob vytváření kódu a je specifický pro JavaScript a TypeScript.
- Modul runtime: Definuje základní chování služby Azure Functions a sdílí se napříč všemi jazyky.
- Verze programovacího modelu je přísně svázaná s verzí
@azure/functions
balíčku npm. Verze je nezávislá na modulu runtime. Modul runtime i programovací model používají číslo 4 jako nejnovější hlavní verzi, ale to je náhoda. - Programovací modely v3 a v4 nemůžete kombinovat ve stejné aplikaci funkcí. Jakmile ve své aplikaci zaregistrujete jednu funkci v4, budou všechny funkce v3 zaregistrované v function.json souborech ignorovány.
Podporované verze
Následující tabulka uvádí každou verzi programovacího modelu Node.js spolu s podporovanými verzemi modulu runtime Azure Functions a Node.js.
Verze programovacího modelu | Úroveň podpory | Verze modulu runtime služby Functions | verze Node.js | Popis |
---|---|---|---|---|
4.x | GA | 4.25+ | 20.x, 18.x | Podporuje flexibilní strukturu souborů a přístup orientovaný na kód pro triggery a vazby. |
3.x | GA | 4.x | 20.x, 18.x, 16.x, 14.x | Vyžaduje konkrétní strukturu souborů s triggery a vazbami deklarovanými v souboru "function.json". |
2.x | Není k dispozici | 3.x | 14.x, 12.x, 10.x | Podpora skončila 13. prosince 2022. Další informace najdete v tématu Verze služby Functions. |
1.x | Není k dispozici | 2.x | 10.x, 8.x | Podpora skončila 13. prosince 2022. Další informace najdete v tématu Verze služby Functions. |
Struktura složek
Požadovaná struktura složek pro projekt JavaScriptu vypadá jako v následujícím příkladu:
<project_root>/
| - .vscode/
| - node_modules/
| - myFirstFunction/
| | - index.js
| | - function.json
| - mySecondFunction/
| | - index.js
| | - function.json
| - .funcignore
| - host.json
| - local.settings.json
| - package.json
Hlavní složka projektu, <project_root>, může obsahovat následující soubory:
- .vscode/: (volitelné) Obsahuje uloženou konfiguraci editoru Visual Studio Code. Další informace najdete v nastavení editoru Visual Studio Code.
- myFirstFunction/function.json: Obsahuje konfiguraci pro aktivační událost, vstupy a výstupy funkce. Název adresáře určuje název vaší funkce.
- myFirstFunction/index.js: Ukládá kód funkce. Pokud chcete změnit tuto výchozí cestu k souboru, podívejte se na použití scriptFile.
- .funcignore: (Volitelné) Deklaruje soubory, které by se neměly publikovat do Azure. Tento soubor obvykle obsahuje soubor .vscode/ pro ignorování nastavení editoru, testování/ ignorování testovacích případů a local.settings.json , aby se zabránilo publikování nastavení místní aplikace.
- host.json: Obsahuje možnosti konfigurace, které ovlivňují všechny funkce v instanci aplikace funkcí. Tento soubor se publikuje do Azure. Při místním spuštění nejsou podporované všechny možnosti. Další informace najdete v tématu host.json.
- local.settings.json: Slouží k ukládání nastavení aplikací a připojovací řetězec při místním spuštění. Tento soubor se nepublikuje do Azure. Další informace najdete v souboru local.settings.file.
- package.json: Obsahuje možnosti konfigurace, jako je seznam závislostí balíčků, hlavní vstupní bod a skripty.
Doporučená struktura složek pro projekt JavaScriptu vypadá jako v následujícím příkladu:
<project_root>/
| - .vscode/
| - node_modules/
| - src/
| | - functions/
| | | - myFirstFunction.js
| | | - mySecondFunction.js
| - test/
| | - functions/
| | | - myFirstFunction.test.js
| | | - mySecondFunction.test.js
| - .funcignore
| - host.json
| - local.settings.json
| - package.json
Hlavní složka projektu, <project_root>, může obsahovat následující soubory:
- .vscode/: (volitelné) Obsahuje uloženou konfiguraci editoru Visual Studio Code. Další informace najdete v nastavení editoru Visual Studio Code.
- src/functions/: Výchozí umístění pro všechny funkce a související triggery a vazby.
- test/: (Volitelné) Obsahuje testovací případy vaší aplikace funkcí.
- .funcignore: (Volitelné) Deklaruje soubory, které by se neměly publikovat do Azure. Tento soubor obvykle obsahuje soubor .vscode/ pro ignorování nastavení editoru, testování/ ignorování testovacích případů a local.settings.json , aby se zabránilo publikování nastavení místní aplikace.
- host.json: Obsahuje možnosti konfigurace, které ovlivňují všechny funkce v instanci aplikace funkcí. Tento soubor se publikuje do Azure. Při místním spuštění nejsou podporované všechny možnosti. Další informace najdete v tématu host.json.
- local.settings.json: Slouží k ukládání nastavení aplikací a připojovací řetězec při místním spuštění. Tento soubor se nepublikuje do Azure. Další informace najdete v souboru local.settings.file.
- package.json: Obsahuje možnosti konfigurace, jako je seznam závislostí balíčků, hlavní vstupní bod a skripty.
Registrace funkce
Model v3 zaregistruje funkci na základě existence dvou souborů. Nejprve potřebujete function.json
soubor umístěný ve složce o jednu úroveň dolů od kořenového adresáře aplikace. Zadruhé potřebujete javascriptový soubor, který exportuje vaši funkci. Ve výchozím nastavení model hledá index.js
soubor ve stejné složce jako vaše function.json
. Pokud používáte TypeScript, musíte použít scriptFile
vlastnost function.json
odkazovat na zkompilovaný javascriptový soubor. Pokud chcete přizpůsobit umístění souboru nebo název exportu funkce, podívejte se na konfiguraci vstupního bodu vaší funkce.
Funkce, kterou exportujete, by měla být vždy deklarována jako v async function
modelu v3. Synchronní funkci můžete exportovat, ale pak musíte volat context.done()
signál, že je vaše funkce dokončena, což je zastaralé a nedoporučuje se.
Funkce se předá vyvolání context
jako první argument a vstupy jako zbývající argumenty.
Následující příklad je jednoduchá funkce, která protokoluje, že byla aktivována a odpovídá:Hello, world!
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"authLevel": "anonymous",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
module.exports = async function (context, request) {
context.log('Http function was triggered.');
context.res = { body: 'Hello, world!' };
};
Programovací model načte vaše funkce na main
základě pole ve vašem package.json
. Pole můžete nastavit main
na jeden soubor nebo více souborů pomocí vzoru globu. Následující tabulka ukazuje ukázkové hodnoty pro main
pole:
Příklad | Popis |
---|---|
src/index.js |
Zaregistrujte funkce z jednoho kořenového souboru. |
src/functions/*.js |
Zaregistrujte každou funkci z vlastního souboru. |
src/{index.js,functions/*.js} |
Kombinace, kde každou funkci zaregistrujete z vlastního souboru, ale stále máte kořenový soubor pro obecný kód na úrovni aplikace. |
Chcete-li zaregistrovat funkci, musíte importovat app
objekt z @azure/functions
modulu npm a volat metodu specifickou pro váš typ triggeru. Prvním argumentem při registraci funkce je název funkce. Druhým argumentem options
je objekt určující konfiguraci pro trigger, obslužnou rutinu a všechny další vstupy nebo výstupy. V některých případech, kdy není konfigurace triggeru nutná, můžete obslužnou rutinu předat přímo jako druhý argument místo objektu options
.
Registraci funkce je možné provést z libovolného souboru v projektu, pokud je tento soubor načten (přímo nebo nepřímo) na main
základě pole v package.json
souboru. Funkce by měla být zaregistrována v globálním oboru, protože po spuštění nelze zaregistrovat funkce.
Následující příklad je jednoduchá funkce, která protokoluje, že byla aktivována a odpovídá:Hello, world!
const { app } = require('@azure/functions');
app.http('helloWorld1', {
methods: ['POST', 'GET'],
handler: async (request, context) => {
context.log('Http function was triggered.');
return { body: 'Hello, world!' };
}
});
Vstupy a výstupy
Vaše funkce musí mít přesně jeden primární vstup, který se nazývá trigger. Může mít také sekundární vstupy nebo výstupy. Vstupy a výstupy se konfigurují ve vašich function.json
souborech a označují se také jako vazby.
Vstupy
Vstupy jsou vazby s nastaveným direction
na in
. Hlavní rozdíl mezi triggerem a sekundárním vstupem spočívá v Trigger
tom, že type
aktivační událost končí , například typ blobTrigger
blob
vs. Většina funkcí používá pouze aktivační událost a nepodporuje se mnoho sekundárních vstupních typů.
Ke vstupům je možné přistupovat několika způsoby:
[Doporučeno] Jako argumenty předané funkci: Použijte argumenty ve stejném pořadí, v jakém jsou definovány .
function.json
Vlastnostname
definovaná vfunction.json
argumentu se nemusí shodovat s názvem argumentu, i když se doporučuje pro účely organizace.module.exports = async function (context, myTrigger, myInput, myOtherInput) { ... };
Jako vlastnosti
context.bindings
: Použijte klíč odpovídajícíname
vlastnosti definované vfunction.json
.module.exports = async function (context) { context.log("This is myTrigger: " + context.bindings.myTrigger); context.log("This is myInput: " + context.bindings.myInput); context.log("This is myOtherInput: " + context.bindings.myOtherInput); };
Výstupy
Výstupy jsou vazby s nastaveným direction
nastavením out
a lze je nastavit několika způsoby:
[Doporučeno pro jeden výstup] Vrátí hodnotu přímo: Pokud používáte asynchronní funkci, můžete ji vrátit přímo. Vlastnost výstupní vazby je nutné změnit
name
tak, aby$return
vypadalafunction.json
jako v následujícím příkladu:{ "name": "$return", "type": "http", "direction": "out" }
module.exports = async function (context, request) { return { body: "Hello, world!" }; }
[Doporučeno pro více výstupů] Vrátí objekt obsahující všechny výstupy: Pokud používáte asynchronní funkci, můžete vrátit objekt s vlastností odpovídající názvu každé vazby ve vaší
function.json
. Následující příklad používá výstupní vazby s názvem httpResponse a queueOutput:{ "name": "httpResponse", "type": "http", "direction": "out" }, { "name": "queueOutput", "type": "queue", "direction": "out", "queueName": "helloworldqueue", "connection": "storage_APPSETTING" }
module.exports = async function (context, request) { let message = 'Hello, world!'; return { httpResponse: { body: message }, queueOutput: message }; };
Nastavte hodnoty na
context.bindings
: Pokud nepoužíváte asynchronní funkci nebo nechcete používat předchozí možnosti, můžete hodnoty nastavit přímo nacontext.bindings
místo, kde klíč odpovídá názvu vazby. Následující příklad používá výstupní vazby s názvem httpResponse a queueOutput:{ "name": "httpResponse", "type": "http", "direction": "out" }, { "name": "queueOutput", "type": "queue", "direction": "out", "queueName": "helloworldqueue", "connection": "storage_APPSETTING" }
module.exports = async function (context, request) { let message = 'Hello, world!'; context.bindings.httpResponse = { body: message }; context.bindings.queueOutput = message; };
Datové typy vazby
Vlastnost vstupní vazby dataType
můžete použít ke změně typu vstupu, ale má určitá omezení:
- V Node.js jsou podporovány pouze
string
abinary
podporované (stream
není) - U vstupů
dataType
HTTP je vlastnost ignorována. Místo toho použijte vlastnosti objekturequest
k získání textu v požadovaném formátu. Další informace najdete v požadavku HTTP.
V následujícím příkladu triggeru fronty úložiště je výchozím typem myQueueItem
string
, ale pokud nastavíte binary
dataType
, typ se změní na Node.js Buffer
.
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "helloworldqueue",
"connection": "storage_APPSETTING",
"dataType": "binary"
}
const { Buffer } = require('node:buffer');
module.exports = async function (context, myQueueItem) {
if (typeof myQueueItem === 'string') {
context.log('myQueueItem is a string');
} else if (Buffer.isBuffer(myQueueItem)) {
context.log('myQueueItem is a buffer');
}
};
Vaše funkce musí mít přesně jeden primární vstup, který se nazývá trigger. Může mít také sekundární vstupy, primární výstup označovaný jako návratový výstup nebo sekundární výstupy. Vstupy a výstupy se také označují jako vazby mimo kontext programovacího modelu Node.js. Před verzí 4 modelu byly tyto vazby nakonfigurovány v function.json
souborech.
Vstup triggeru
Aktivační událost je jediným požadovaným vstupem nebo výstupem. U většiny typů triggerů zaregistrujete funkci pomocí metody u objektu app
pojmenovaného po typu triggeru. Můžete zadat konfiguraci specifickou pro trigger přímo v argumentu options
. Například trigger HTTP umožňuje zadat trasu. Během provádění se hodnota odpovídající této aktivační události předává jako první argument obslužné rutině.
const { app } = require('@azure/functions');
app.http('helloWorld1', {
route: 'hello/world',
handler: async (request, context) => {
...
}
});
Návratový výstup
Návratový výstup je volitelný a v některých případech je ve výchozím nastavení nakonfigurovaný. Například trigger HTTP zaregistrovaný pomocí app.http
je nakonfigurovaný tak, aby automaticky vrátil výstup odpovědi HTTP. U většiny výstupních typů zadáte návratovou konfiguraci options
argumentu pomocí objektu output
exportovaného z @azure/functions
modulu. Během provádění nastavíte tento výstup tak, že ho vrátíte z obslužné rutiny.
Následující příklad používá trigger časovače a výstup fronty úložiště:
const { app, output } = require('@azure/functions');
app.timer('timerTrigger1', {
schedule: '0 */5 * * * *',
return: output.storageQueue({
connection: 'storage_APPSETTING',
...
}),
handler: (myTimer, context) => {
return { hello: 'world' }
}
});
Další vstupy a výstupy
Kromě triggeru a návratu můžete při registraci funkce zadat další vstupy nebo výstupy options
argumentu. Objekty input
a objekty exportované z @azure/functions
modulu poskytují metody specifické pro typ, které pomáhají při vytváření output
konfigurace. Během provádění získáte nebo nastavíte hodnoty s původním konfiguračním objektem context.extraInputs.get
nebo context.extraOutputs.set
, předáním původního objektu konfigurace jako prvního argumentu.
Následující příklad je funkce aktivovaná frontou úložiště s dodatečným vstupem objektu blob úložiště, který se zkopíruje do extra výstupu objektu blob úložiště. Zpráva fronty {queueTrigger}
by měla být název souboru a nahradí se jako název objektu blob, který se má zkopírovat, pomocí vazbového výrazu.
const { app, input, output } = require('@azure/functions');
const blobInput = input.storageBlob({
connection: 'storage_APPSETTING',
path: 'helloworld/{queueTrigger}',
});
const blobOutput = output.storageBlob({
connection: 'storage_APPSETTING',
path: 'helloworld/{queueTrigger}-copy',
});
app.storageQueue('copyBlob1', {
queueName: 'copyblobqueue',
connection: 'storage_APPSETTING',
extraInputs: [blobInput],
extraOutputs: [blobOutput],
handler: (queueItem, context) => {
const blobInputValue = context.extraInputs.get(blobInput);
context.extraOutputs.set(blobOutput, blobInputValue);
}
});
Obecné vstupy a výstupy
Modul app
, trigger
input
a output
objekty exportované @azure/functions
modulem poskytují metody specifické pro typ pro většinu typů. Pro všechny typy, které nejsou podporovány, je k dispozici metoda, generic
která vám umožní ručně zadat konfiguraci. Metodu generic
lze použít také v případě, že chcete změnit výchozí nastavení poskytovaná metodou specifickou pro konkrétní typ.
Následující příklad je jednoduchá funkce aktivovaná protokolem HTTP, která místo metod specifických pro typ používá obecné metody.
const { app, output, trigger } = require('@azure/functions');
app.generic('helloWorld1', {
trigger: trigger.generic({
type: 'httpTrigger',
methods: ['GET', 'POST']
}),
return: output.generic({
type: 'http'
}),
handler: async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
return { body: `Hello, world!` };
}
});
Kontext vyvolání
Každé vyvolání funkce se předává objekt vyvolání context
, který se používá ke čtení vstupů, nastavení výstupů, zápisu do protokolů a čtení různých metadat. V modelu v3 je kontextový objekt vždy prvním argumentem předaný obslužné rutině.
Objekt context
má následující vlastnosti:
Vlastnost | Popis |
---|---|
invocationId |
ID vyvolání aktuální funkce. |
executionContext |
Viz kontext spuštění. |
bindings |
Viz vazby. |
bindingData |
Metadata o vstupu triggeru pro toto vyvolání, nikoli zahrnutí samotné hodnoty. Například trigger centra událostí má enqueuedTimeUtc vlastnost. |
traceContext |
Kontext distribuovaného trasování. Další informace najdete na webu Trace Context . |
bindingDefinitions |
Konfigurace vašich vstupů a výstupů, jak je definováno v function.json . |
req |
Viz požadavek HTTP. |
res |
Viz odpověď HTTP. |
context.executionContext
Objekt context.executionContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
invocationId |
ID vyvolání aktuální funkce. |
functionName |
Název funkce, která se vyvolá. Název složky obsahující function.json soubor určuje název funkce. |
functionDirectory |
Složka obsahující function.json soubor. |
retryContext |
Viz kontext opakování. |
context.executionContext.retryContext
Objekt context.executionContext.retryContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
retryCount |
Číslo představující aktuální pokus o opakování. |
maxRetryCount |
Maximální počet opakování provádění Hodnota -1 prostředků, která se má opakovat po neomezenou dobu. |
exception |
Výjimka, která způsobila opakování |
context.bindings
Objekt context.bindings
se používá ke čtení vstupů nebo nastavení výstupů. Následující příklad je trigger fronty úložiště, který používá context.bindings
ke zkopírování vstupu objektu blob úložiště do výstupu objektu blob úložiště. Obsah zprávy fronty se {queueTrigger}
nahradí jako název souboru, který se má zkopírovat, pomocí vazbového výrazu.
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"connection": "storage_APPSETTING",
"queueName": "helloworldqueue"
},
{
"name": "myInput",
"type": "blob",
"direction": "in",
"connection": "storage_APPSETTING",
"path": "helloworld/{queueTrigger}"
},
{
"name": "myOutput",
"type": "blob",
"direction": "out",
"connection": "storage_APPSETTING",
"path": "helloworld/{queueTrigger}-copy"
}
module.exports = async function (context, myQueueItem) {
const blobValue = context.bindings.myInput;
context.bindings.myOutput = blobValue;
};
context.done
Metoda context.done
je zastaralá. Před podporou asynchronních funkcí byste signalizovali, že se funkce provádí voláním context.done()
:
module.exports = function (context, request) {
context.log("this pattern is now deprecated");
context.done();
};
Teď doporučujeme odebrat volání context.done()
a označit funkci jako asynchronní, aby vrátila příslib (i když nic neuděláte await
). Jakmile se vaše funkce dokončí (jinými slovy, vrácený příslib se vyřeší), model v3 ví, že je vaše funkce hotová.
module.exports = async function (context, request) {
context.log("you don't need context.done or an awaited call")
};
Každé vyvolání funkce se předá objekt vyvolání context
s informacemi o vyvolání a metodách používaných k protokolování. V modelu context
v4 je objekt obvykle druhým argumentem předaný obslužné rutině.
Třída InvocationContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
invocationId |
ID vyvolání aktuální funkce. |
functionName |
Název funkce. |
extraInputs |
Slouží k získání hodnot dodatečných vstupů. Další informace najdete v dalších vstupech a výstupech. |
extraOutputs |
Slouží k nastavení hodnot extra výstupů. Další informace najdete v dalších vstupech a výstupech. |
retryContext |
Viz kontext opakování. |
traceContext |
Kontext distribuovaného trasování. Další informace najdete na webu Trace Context . |
triggerMetadata |
Metadata o vstupu triggeru pro toto vyvolání, nikoli zahrnutí samotné hodnoty. Například trigger centra událostí má enqueuedTimeUtc vlastnost. |
options |
Možnosti použité při registraci funkce po jejich ověření a ve výchozím nastavení explicitně zadané. |
Kontext opakování
Objekt retryContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
retryCount |
Číslo představující aktuální pokus o opakování. |
maxRetryCount |
Maximální počet opakování provádění Hodnota -1 prostředků, která se má opakovat po neomezenou dobu. |
exception |
Výjimka, která způsobila opakování |
Další informace najdete na webu retry-policies
.
Protokolování
Ve službě Azure Functions se doporučuje použít context.log()
k zápisu protokolů. Azure Functions se integruje s Aplikace Azure lication Insights, aby lépe zachytila protokoly vaší aplikace funkcí. Application Insights, která je součástí služby Azure Monitor, poskytuje zařízení pro shromažďování, vizuální vykreslování a analýzu protokolů aplikací i výstupů trasování. Další informace najdete v tématu monitorování služby Azure Functions.
Poznámka:
Pokud použijete alternativní Node.js console.log
metodu, tyto protokoly se sledují na úrovni aplikace a nebudou přidruženy k žádné konkrétní funkci. Důrazně doporučujeme místo protokolování console
použít context
všechny protokoly, které jsou přidružené ke konkrétní funkci.
Následující příklad zapíše protokol na výchozí úroveň "information", včetně ID vyvolání:
context.log(`Something has happened. Invocation ID: "${context.invocationId}"`);
Úrovně protokolování
Kromě výchozí context.log
metody jsou k dispozici následující metody, které umožňují psát protokoly na konkrétních úrovních:
metoda | Popis |
---|---|
context.log.error() |
Zapíše do protokolů událost na úrovni chyby. |
context.log.warn() |
Zapíše do protokolů událost na úrovni upozornění. |
context.log.info() |
Zapíše do protokolů událost na úrovni informací. |
context.log.verbose() |
Zapíše do protokolů událost na úrovni trasování. |
metoda | Popis |
---|---|
context.trace() |
Zapíše do protokolů událost na úrovni trasování. |
context.debug() |
Zapíše do protokolů událost na úrovni ladění. |
context.info() |
Zapíše do protokolů událost na úrovni informací. |
context.warn() |
Zapíše do protokolů událost na úrovni upozornění. |
context.error() |
Zapíše do protokolů událost na úrovni chyby. |
Konfigurace úrovně protokolu
Azure Functions umožňuje definovat prahovou úroveň, kterou se má použít při sledování a prohlížení protokolů. K nastavení prahové hodnoty použijte logging.logLevel
vlastnost v host.json
souboru. Tato vlastnost umožňuje definovat výchozí úroveň použitou pro všechny funkce nebo prahovou hodnotu pro každou jednotlivou funkci. Další informace najdete v tématu Konfigurace monitorování pro Azure Functions.
Sledování vlastních dat
Azure Functions ve výchozím nastavení zapisuje výstup jako trasování do Application Insights. Pokud chcete mít větší kontrolu, můžete místo toho použít sadu Application Insights Node.js SDK k odesílání vlastních dat do instance Application Insights.
const appInsights = require("applicationinsights");
appInsights.setup();
const client = appInsights.defaultClient;
module.exports = async function (context, request) {
// Use this with 'tagOverrides' to correlate custom logs to the parent function invocation.
var operationIdOverride = {"ai.operation.id":context.traceContext.traceparent};
client.trackEvent({name: "my custom event", tagOverrides:operationIdOverride, properties: {customProperty2: "custom property value"}});
client.trackException({exception: new Error("handled exceptions can be logged with this method"), tagOverrides:operationIdOverride});
client.trackMetric({name: "custom metric", value: 3, tagOverrides:operationIdOverride});
client.trackTrace({message: "trace message", tagOverrides:operationIdOverride});
client.trackDependency({target:"http://dbname", name:"select customers proc", data:"SELECT * FROM Customers", duration:231, resultCode:0, success: true, dependencyTypeName: "ZSQL", tagOverrides:operationIdOverride});
client.trackRequest({name:"GET /customers", url:"http://myserver/customers", duration:309, resultCode:200, success:true, tagOverrides:operationIdOverride});
};
Parametr tagOverrides
nastaví operation_Id
ID vyvolání funkce. Toto nastavení umožňuje korelovat všechny automaticky generované a vlastní protokoly pro vyvolání dané funkce.
Triggery HTTP
Triggery HTTP a webhooku používají objekty požadavků a odpovědí k reprezentaci zpráv HTTP.
Triggery HTTP a webhooku používají HttpRequest
a HttpResponse
objekty k reprezentaci zpráv HTTP. Třídy představují podmnožinu standardu načítání pomocí balíčku Node.jsundici
.
Požadavek HTTP
K žádosti je možné získat přístup několika způsoby:
Jako druhý argument funkce:
module.exports = async function (context, request) { context.log(`Http function processed request for url "${request.url}"`);
context.req
Z vlastnosti:module.exports = async function (context, request) { context.log(`Http function processed request for url "${context.req.url}"`);
Z pojmenovaných vstupních vazeb: Tato možnost funguje stejně jako všechny vazby jiné než HTTP. Název
function.json
vazby musí odpovídat klíči nacontext.bindings
nebo "request1" v následujícím příkladu:{ "name": "request1", "type": "httpTrigger", "direction": "in", "authLevel": "anonymous", "methods": [ "get", "post" ] }
module.exports = async function (context, request) { context.log(`Http function processed request for url "${context.bindings.request1.url}"`);
Objekt HttpRequest
má následující vlastnosti:
Vlastnost | Type | Popis |
---|---|---|
method |
string |
Metoda požadavku HTTP použitá k vyvolání této funkce. |
url |
string |
Adresa URL požadavku. |
headers |
Record<string, string> |
Hlavičky požadavku HTTP. U tohoto objektu se rozlišují malá a velká písmena. Místo toho se doporučuje používat request.getHeader('header-name') nerozlišující velká a malá písmena. |
query |
Record<string, string> |
Zadejte dotaz na klíče parametrů řetězce a hodnoty z adresy URL. |
params |
Record<string, string> |
Směrovat klíče a hodnoty parametrů. |
user |
HttpRequestUser | null |
Objekt představující přihlášeného uživatele, a to buď prostřednictvím ověřování funkcí, ověřování SWA nebo null, pokud se takový uživatel nepřihlašuje. |
body |
Buffer | string | any |
Pokud je typ média "application/octet-stream" nebo "multipart/*", body je vyrovnávací paměť. Pokud je hodnota řetězec podporující parsování JSON, body jedná se o parsovaný objekt. body Jinak je to řetězec. |
rawBody |
string |
Tělo jako řetězec. Navzdory názvu tato vlastnost nevrací vyrovnávací paměť. |
bufferBody |
Buffer |
Tělo jako vyrovnávací paměť. |
Požadavek může být přístupný jako první argument obslužné rutiny pro funkci aktivovanou protokolem HTTP.
async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
Objekt HttpRequest
má následující vlastnosti:
Vlastnost | Type | Popis |
---|---|---|
method |
string |
Metoda požadavku HTTP použitá k vyvolání této funkce. |
url |
string |
Adresa URL požadavku. |
headers |
Headers |
Hlavičky požadavku HTTP. |
query |
URLSearchParams |
Zadejte dotaz na klíče parametrů řetězce a hodnoty z adresy URL. |
params |
Record<string, string> |
Směrovat klíče a hodnoty parametrů. |
user |
HttpRequestUser | null |
Objekt představující přihlášeného uživatele, a to buď prostřednictvím ověřování funkcí, ověřování SWA nebo null, pokud se takový uživatel nepřihlašuje. |
body |
ReadableStream | null |
Tělo jako čitelný datový proud |
bodyUsed |
boolean |
Logická hodnota označující, jestli je tělo již přečtené. |
Pro přístup k textu požadavku nebo odpovědi je možné použít následující metody:
Metoda | Návratový typ |
---|---|
arrayBuffer() |
Promise<ArrayBuffer> |
blob() |
Promise<Blob> |
formData() |
Promise<FormData> |
json() |
Promise<unknown> |
text() |
Promise<string> |
Poznámka:
Funkce těla lze spouštět pouze jednou; následná volání se přeloží s prázdnými řetězci nebo ArrayBuffers.
Odpověď protokolu HTTP
Odpověď lze nastavit několika způsoby:
context.res
Nastavte vlastnost:module.exports = async function (context, request) { context.res = { body: `Hello, world!` };
Vraťte odpověď: Pokud je vaše funkce asynchronní a nastavíte název
$return
vazby ve vašífunction.json
, můžete odpověď vrátit přímo místo jeho nastavení .context
{ "type": "http", "direction": "out", "name": "$return" }
module.exports = async function (context, request) { return { body: `Hello, world!` };
Nastavte pojmenovanou výstupní vazbu: Tato možnost funguje stejně jako všechny vazby jiného typu než HTTP. Název
function.json
vazby musí odpovídat klíči nacontext.bindings
nebo "response1" v následujícím příkladu:{ "type": "http", "direction": "out", "name": "response1" }
module.exports = async function (context, request) { context.bindings.response1 = { body: `Hello, world!` };
Volání
context.res.send()
: Tato možnost je zastaralá. Implicitně volácontext.done()
a nedá se použít v asynchronní funkci.module.exports = function (context, request) { context.res.send(`Hello, world!`);
Pokud při nastavování odpovědi vytvoříte nový objekt, musí tento objekt odpovídat HttpResponseSimple
rozhraní, které má následující vlastnosti:
Vlastnost | Type | Popis |
---|---|---|
headers |
Record<string, string> (volitelné) |
Hlavičky odpovědi HTTP. |
cookies |
Cookie[] (volitelné) |
Soubory cookie odpovědi HTTP. |
body |
any (volitelné) |
Text odpovědi HTTP. |
statusCode |
number (volitelné) |
Stavový kód odpovědi HTTP. Pokud není nastavená, výchozí hodnota 200 je . |
status |
number (volitelné) |
Totéž jako statusCode . Tato vlastnost je ignorována, pokud statusCode je nastavena. |
Objekt můžete také upravit context.res
bez přepsání. Výchozí context.res
objekt používá HttpResponseFull
rozhraní, které podporuje následující metody kromě HttpResponseSimple
vlastností:
metoda | Popis |
---|---|
status() |
Nastaví stav. |
setHeader() |
Nastaví pole záhlaví. POZNÁMKA: res.set() a res.header() jsou také podporovány a dělat totéž. |
getHeader() |
Získejte pole záhlaví. POZNÁMKA: res.get() Je také podporován a dělá totéž. |
removeHeader() |
Odebere záhlaví. |
type() |
Nastaví hlavičku content-type. |
send() |
Tato metoda je zastaralá. Nastaví tělo a volání context.done() označující, že je synchronizační funkce dokončena. POZNÁMKA: res.end() Je také podporován a dělá totéž. |
sendStatus() |
Tato metoda je zastaralá. Nastaví stavový kód a volání context.done() , která označují dokončení synchronizační funkce. |
json() |
Tato metoda je zastaralá. Nastaví "content-type" na "application/json", nastaví tělo a volání context.done() označující, že synchronizační funkce je dokončena. |
Odpověď lze nastavit několika způsoby:
Jako jednoduché rozhraní s typem
HttpResponseInit
: Tato možnost je nejvýstižnější způsob vrácení odpovědí.return { body: `Hello, world!` };
Rozhraní
HttpResponseInit
má následující vlastnosti:Vlastnost Type Popis body
BodyInit
(volitelné)Text odpovědi HTTP jako jeden z ArrayBuffer
,AsyncIterable<Uint8Array>
,Blob
NodeJS.ArrayBufferView
Iterable<Uint8Array>
URLSearchParams
FormData
,null
, nebo .string
jsonBody
any
(volitelné)Serializovatelný text odpovědi HTTP json. Pokud je nastavena, HttpResponseInit.body
vlastnost je ignorována ve prospěch této vlastnosti.status
number
(volitelné)Stavový kód odpovědi HTTP. Pokud není nastavená, výchozí hodnota 200
je .headers
HeadersInit
(volitelné)Hlavičky odpovědi HTTP. cookies
Cookie[]
(volitelné)Soubory cookie odpovědi HTTP. Jako třída s typem
HttpResponse
: Tato možnost poskytuje pomocné metody pro čtení a úpravy různých částí odpovědi, jako jsou hlavičky.const response = new HttpResponse({ body: `Hello, world!` }); response.headers.set('content-type', 'application/json'); return response;
Třída
HttpResponse
přijímá volitelnýHttpResponseInit
argument jako argument jeho konstruktoru a má následující vlastnosti:Vlastnost Type Popis status
number
Stavový kód odpovědi HTTP. headers
Headers
Hlavičky odpovědi HTTP. cookies
Cookie[]
Soubory cookie odpovědi HTTP. body
ReadableStream | null
Tělo jako čitelný datový proud bodyUsed
boolean
Logická hodnota označující, jestli už bylo tělo přečteno.
Streamy HTTP
Streamy HTTP jsou funkce, která usnadňuje zpracování velkých dat, streamování odpovědí OpenAI, doručování dynamického obsahu a podporu dalších základních scénářů HTTP. Umožňuje streamovat požadavky na koncové body HTTP a odpovědi z aplikace funkcí Node.js. Streamy HTTP používejte ve scénářích, kdy vaše aplikace vyžaduje výměnu v reálném čase a interakci mezi klientem a serverem přes PROTOKOL HTTP. Streamy HTTP můžete použít také k zajištění nejlepšího výkonu a spolehlivosti vašich aplikací při používání protokolu HTTP.
Důležité
Streamy HTTP nejsou v modelu v3 podporované. Upgradujte na model verze 4 a použijte funkci streamování HTTP.
Existující HttpRequest
a HttpResponse
typy v programovacím modelu v4 již podporují různé způsoby zpracování textu zprávy, včetně datového proudu.
Požadavky
- Balíček
@azure/functions
npm verze 4.3.0 nebo novější. - Modul runtime Azure Functions verze 4.28 nebo novější
- Azure Functions Core Tools verze 4.0.5530 nebo novější verze, která obsahuje správnou verzi modulu runtime.
Povolení datových proudů
Pomocí těchto kroků povolíte streamy HTTP ve vaší aplikaci funkcí v Azure a v místních projektech:
Pokud plánujete streamovat velké objemy dat, upravte
FUNCTIONS_REQUEST_BODY_SIZE_LIMIT
nastavení v Azure. Výchozí maximální povolená velikost těla je104857600
, což omezuje vaše požadavky na velikost ~100 MB.Pro místní vývoj přidejte
FUNCTIONS_REQUEST_BODY_SIZE_LIMIT
také do souboru local.settings.json.Do libovolného souboru, který je součástí hlavního pole, přidejte do aplikace následující kód.
const { app } = require('@azure/functions'); app.setup({ enableHttpStream: true });
Příklady streamu
Tento příklad ukazuje funkci aktivovanou protokolem HTTP, která přijímá data prostřednictvím požadavku HTTP POST, a funkce streamuje tato data do zadaného výstupního souboru:
const { app } = require('@azure/functions');
const { createWriteStream } = require('fs');
const { Writable } = require('stream');
app.http('httpTriggerStreamRequest', {
methods: ['POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
const writeStream = createWriteStream('<output file path>');
await request.body.pipeTo(Writable.toWeb(writeStream));
return { body: 'Done!' };
},
});
Tento příklad ukazuje funkci aktivovanou protokolem HTTP, která streamuje obsah souboru jako odpověď na příchozí požadavky HTTP GET:
const { app } = require('@azure/functions');
const { createReadStream } = require('fs');
app.http('httpTriggerStreamResponse', {
methods: ['GET'],
authLevel: 'anonymous',
handler: async (request, context) => {
const body = createReadStream('<input file path>');
return { body };
},
});
Pokud chcete ukázkovou aplikaci připravenou ke spuštění pomocí streamů, podívejte se na tento příklad na GitHubu.
Aspekty datových proudů
- Slouží
request.body
k získání maximální výhody používání datových proudů. Stále můžete i nadále používat metody, jakorequest.text()
je , které vždy vrací tělo jako řetězec.
Volané služby
Háky nejsou v modelu v3 podporované. Upgradujte na model v4, abyste mohli používat háky.
Pomocí háku můžete spustit kód v různých bodech životního cyklu služby Azure Functions. Háky se spouštějí v pořadí, ve kterém jsou zaregistrované, a dají se zaregistrovat z libovolného souboru ve vaší aplikaci. V současné době existují dva rozsahy háku, úroveň aplikace a úroveň vyvolání.
Vyvolání háků
Volání háku se spustí jednou za vyvolání funkce, a to buď před hákem preInvocation
, nebo po háku postInvocation
. Ve výchozím nastavení se váš hook spustí pro všechny typy aktivačních událostí, ale můžete také filtrovat podle typu. Následující příklad ukazuje, jak zaregistrovat volání hook a filtrovat podle typu triggeru:
const { app } = require('@azure/functions');
app.hook.preInvocation((context) => {
if (context.invocationContext.options.trigger.type === 'httpTrigger') {
context.invocationContext.log(
`preInvocation hook executed for http function ${context.invocationContext.functionName}`
);
}
});
app.hook.postInvocation((context) => {
if (context.invocationContext.options.trigger.type === 'httpTrigger') {
context.invocationContext.log(
`postInvocation hook executed for http function ${context.invocationContext.functionName}`
);
}
});
Prvním argumentem obslužné rutiny háku je kontextový objekt specifický pro daný typ háku.
Objekt PreInvocationContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
inputs |
Argumenty předané volání. |
functionHandler |
Obslužná rutina funkce pro vyvolání. Změny této hodnoty ovlivňují samotnou funkci. |
invocationContext |
Objekt kontextu vyvolání předaný funkci. |
hookData |
Doporučené místo pro ukládání a sdílení dat mezi háky ve stejném rozsahu. Měli byste použít jedinečný název vlastnosti, aby nebyl v konfliktu s daty jiných háků. |
Objekt PostInvocationContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
inputs |
Argumenty předané volání. |
result |
Výsledek funkce. Změny této hodnoty ovlivňují celkový výsledek funkce. |
error |
Chyba vyvolaná funkcí nebo hodnotou null nebo nedefinovanou, pokud neexistuje žádná chyba. Změny této hodnoty ovlivňují celkový výsledek funkce. |
invocationContext |
Objekt kontextu vyvolání předaný funkci. |
hookData |
Doporučené místo pro ukládání a sdílení dat mezi háky ve stejném rozsahu. Měli byste použít jedinečný název vlastnosti, aby nebyl v konfliktu s daty jiných háků. |
Háky aplikací
Hooky aplikací se spouští jednou za instanci vaší aplikace, a to buď během spuštění v háku appStart
, nebo během ukončení v háku appTerminate
. Volání ukončení aplikace mají omezenou dobu ke spuštění a nespustí se ve všech scénářích.
Modul runtime Azure Functions v současné době nepodporuje protokolování kontextu mimo vyvolání. Pomocí balíčku npm Application Insights můžete protokolovat data během připojení na úrovni aplikace.
Následující příklad zaregistruje háky aplikací:
const { app } = require('@azure/functions');
app.hook.appStart((context) => {
// add your logic here
});
app.hook.appTerminate((context) => {
// add your logic here
});
Prvním argumentem obslužné rutiny háku je kontextový objekt specifický pro daný typ háku.
Objekt AppStartContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
hookData |
Doporučené místo pro ukládání a sdílení dat mezi háky ve stejném rozsahu. Měli byste použít jedinečný název vlastnosti, aby nebyl v konfliktu s daty jiných háků. |
Objekt AppTerminateContext
má následující vlastnosti:
Vlastnost | Popis |
---|---|
hookData |
Doporučené místo pro ukládání a sdílení dat mezi háky ve stejném rozsahu. Měli byste použít jedinečný název vlastnosti, aby nebyl v konfliktu s daty jiných háků. |
Škálování a souběžnost
Azure Functions ve výchozím nastavení automaticky monitoruje zatížení vaší aplikace a podle potřeby vytváří další instance hostitele pro Node.js. Azure Functions používá integrované (ne konfigurovatelné) prahové hodnoty pro různé typy aktivačních událostí, aby se rozhodlo, kdy přidat instance, jako je stáří zpráv a velikost fronty pro QueueTrigger. Další informace najdete v tématu Jak fungují plány Consumption a Premium.
Toto chování škálování je dostatečné pro mnoho Node.js aplikací. U aplikací vázaných na procesor můžete výkon dále zlepšit pomocí více jazykových pracovních procesů. Pomocí nastavení aplikace FUNCTIONS_WORKER_PROCESS_COUNT můžete zvýšit počet pracovních procesů na hostitele z výchozí hodnoty 1 až na 10. Azure Functions se pak pokusí rovnoměrně distribuovat souběžné vyvolání funkcí napříč těmito pracovními procesy. Díky tomuto chování je méně pravděpodobné, že funkce náročná na procesor blokuje spuštění dalších funkcí. Toto nastavení platí pro každého hostitele, kterého Azure Functions vytvoří při horizontálním navýšení kapacity aplikace tak, aby splňovala poptávku.
Upozorňující
FUNCTIONS_WORKER_PROCESS_COUNT
Nastavení používejte s opatrností. Několik procesů spuštěných ve stejné instanci může způsobit nepředvídatelné chování a zvýšit dobu načítání funkcí. Pokud použijete toto nastavení, důrazně doporučujeme tyto nevýhody vyřadit spuštěním ze souboru balíčku.
Verze uzlu
Aktuální verzi, kterou modul runtime používá, můžete zobrazit pomocí protokolování process.version
z libovolné funkce. Seznam supported versions
verzí Node.js podporovaných každým programovacím modelem
Nastavení verze uzlu
Způsob upgradu Node.js verze závisí na operačním systému, na kterém běží vaše aplikace funkcí.
Při spuštění ve Windows je Node.js verze nastavena WEBSITE_NODE_DEFAULT_VERSION
nastavením aplikace. Toto nastavení je možné aktualizovat pomocí Azure CLI nebo na webu Azure Portal.
Další informace o verzích Node.js naleznete v tématu Podporované verze.
Před upgradem Node.js verze se ujistěte, že je vaše aplikace funkcí spuštěná na nejnovější verzi modulu runtime Azure Functions. Pokud potřebujete upgradovat verzi modulu runtime, přečtěte si téma Migrace aplikací z Azure Functions verze 3.x na verzi 4.x.
Spuštěním příkazu Azure CLI az functionapp config appsettings set
aktualizujte verzi Node.js vaší aplikace funkcí spuštěné ve Windows:
az functionapp config appsettings set --settings WEBSITE_NODE_DEFAULT_VERSION=~20 \
--name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME>
Tím se nastaví WEBSITE_NODE_DEFAULT_VERSION
nastavení aplikace podporovanou verzí ~20
LTS .
Po provedení změn se vaše aplikace funkcí restartuje. Další informace o podpoře služby Functions pro Node.js najdete v tématu Zásady podpory modulu runtime jazyka.
Proměnné prostředí
Proměnné prostředí můžou být užitečné pro provozní tajné kódy (připojovací řetězec, klíče, koncové body atd.) nebo nastavení prostředí, jako je profilace proměnných. Proměnné prostředí můžete přidat v místním i cloudovém prostředí a přistupovat k nim prostřednictvím process.env
kódu funkce.
Následující příklad zaznamená proměnnou WEBSITE_SITE_NAME
prostředí:
module.exports = async function (context) {
context.log(`WEBSITE_SITE_NAME: ${process.env["WEBSITE_SITE_NAME"]}`);
}
async function timerTrigger1(myTimer, context) {
context.log(`WEBSITE_SITE_NAME: ${process.env["WEBSITE_SITE_NAME"]}`);
}
V místním vývojovém prostředí
Při místním spuštění projekt funkcí obsahuje local.settings.json
soubor, do kterého ukládáte proměnné prostředí v objektu Values
.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "node",
"CUSTOM_ENV_VAR_1": "hello",
"CUSTOM_ENV_VAR_2": "world"
}
}
V cloudovém prostředí Azure
Když spustíte v Azure, aplikace funkcí umožňuje nastavit a používat nastavení aplikace, jako jsou připojovací řetězec služby, a během provádění tato nastavení zveřejňuje jako proměnné prostředí.
Nastavení aplikace funkcí můžete přidat, aktualizovat a odstranit několika způsoby:
Změny nastavení aplikace funkcí vyžadují restartování aplikace funkcí.
Proměnné pracovního prostředí
Existuje několik proměnných prostředí functions specifických pro Node.js:
languageWorkers__node__arguments
Toto nastavení umožňuje zadat vlastní argumenty při spuštění procesu Node.js. Nejčastěji se používá místně ke spuštění pracovního procesu v režimu ladění, ale pokud potřebujete vlastní argumenty, můžete ho použít také v Azure.
Upozorňující
Pokud je to možné, vyhněte se použití languageWorkers__node__arguments
v Azure, protože může mít negativní vliv na časy studených startů. Místo použití předem připravených pracovních procesů musí modul runtime spustit nový pracovní proces úplně od začátku s vašimi vlastními argumenty.
logging__logLevel__Worker
Toto nastavení upraví výchozí úroveň protokolu pro protokoly pracovních procesů specifických pro Node.js. Ve výchozím nastavení se zobrazují jenom protokoly upozornění nebo chyb, ale můžete je information
nastavit nebo debug
pomoct s diagnostikou problémů s pracovním procesem Node.js. Další informace najdete v tématu konfigurace úrovní protokolu.
Moduly ECMAScript (Preview)
Poznámka:
Vzhledem k tomu, že moduly ECMAScript jsou v současné době ve službě Azure Functions ve verzi Preview ve verzi Node.js 14 nebo vyšší.
Moduly ECMAScript (moduly ES) jsou novým oficiálním standardním systémem modulů pro Node.js. Zatím ukázky kódu v tomto článku používají syntaxi CommonJS. Při spouštění Azure Functions ve Node.js 14 nebo novějších můžete své funkce psát pomocí syntaxe modulů ES.
Pokud chcete ve funkci používat moduly ES, změňte jeho název souboru tak, aby používal příponu .mjs
. Následující příklad souboru index.mjs je funkce aktivovaná protokolem HTTP, která k importu uuid
knihovny používá syntaxi modulů ES a vrací hodnotu.
import { v4 as uuidv4 } from 'uuid';
async function httpTrigger1(context, request) {
context.res.body = uuidv4();
};
export default httpTrigger;
import { v4 as uuidv4 } from 'uuid';
async function httpTrigger1(request, context) {
return { body: uuidv4() };
};
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
handler: httpTrigger1
});
Konfigurace vstupního bodu funkce
Vlastnosti function.json
scriptFile
a entryPoint
lze je použít ke konfiguraci umístění a názvu exportované funkce. Vlastnost scriptFile
je vyžadována při použití TypeScriptu a měla by odkazovat na zkompilovaný JavaScript.
Používání akce scriptFile
Ve výchozím nastavení je javascriptová funkce spuštěna ze index.js
souboru, který sdílí stejný nadřazený adresář jako odpovídající function.json
.
scriptFile
lze použít k získání struktury složek, která vypadá jako v následujícím příkladu:
<project_root>/
| - node_modules/
| - myFirstFunction/
| | - function.json
| - lib/
| | - sayHello.js
| - host.json
| - package.json
Hodnota function.json
for myFirstFunction
by měla obsahovat scriptFile
vlastnost odkazující na soubor s exportovanou funkcí, která se má spustit.
{
"scriptFile": "../lib/sayHello.js",
"bindings": [
...
]
}
Používání akce entryPoint
V modelu v3 musí být funkce exportována pomocí module.exports
, aby byla nalezena a spuštěna. Ve výchozím nastavení je funkce, která se spustí při aktivaci, jediným exportem z daného souboru, exportem s názvem run
nebo exportem s názvem index
. Následující příklad nastaví entryPoint
function.json
vlastní hodnotu logHello:
{
"entryPoint": "logHello",
"bindings": [
...
]
}
async function logHello(context) {
context.log('Hello, world!');
}
module.exports = { logHello };
Místní ladění
Doporučuje se použít VS Code pro místní ladění, které spustí proces Node.js v režimu ladění automaticky a připojí se k procesu za vás. Další informace najdete v tématu místní spuštění funkce.
Pokud k ladění používáte jiný nástroj nebo chcete spustit proces Node.js v režimu ladění ručně, přidejte "languageWorkers__node__arguments": "--inspect"
Values
do local.settings.json. Argument --inspect
říká Node.js, aby ve výchozím nastavení naslouchal ladicímu klientovi na portu 9229. Další informace najdete v průvodci laděním Node.js.
Doporučení
Tato část popisuje několik působivých vzorů pro Node.js aplikace, které doporučujeme sledovat.
Volba plánů služby App Service s jedním virtuálním procesorem
Při vytváření aplikace funkcí, která používá plán služby App Service, doporučujeme místo plánu s více virtuálními procesory vybrat plán vCPU s jedním virtuálním procesorem. V současné době functions běží Node.js funkce efektivněji na virtuálních počítačích s jedním virtuálním procesorem a použití větších virtuálních počítačů nevygeneruje očekávané vylepšení výkonu. V případě potřeby můžete ručně škálovat přidáním dalších instancí virtuálních počítačů s jedním virtuálním procesorem nebo povolením automatického škálování. Další informace najdete v tématu Ruční nebo automatické škálování počtu instancí.
Spuštění ze souboru balíčku
Při vývoji Azure Functions v modelu bezserverového hostování jsou studené starty realitou. Studený start označuje první spuštění aplikace funkcí po určité době nečinnosti, která trvá déle, než se spustí. U Node.js aplikací s velkými stromy závislostí může být důležité zejména studené spuštění. Pokud chcete urychlit proces studeného spuštění, spusťte funkce jako soubor balíčku, pokud je to možné. Mnoho metod nasazení používá tento model ve výchozím nastavení, ale pokud máte velké studené starty, měli byste zkontrolovat, že tímto způsobem pracujete.
Použití jednoho statického klienta
Pokud používáte klienta specifického pro službu v aplikaci Azure Functions, nevytvořte nového klienta s každým vyvoláním funkce, protože můžete využít omezení připojení. Místo toho vytvořte jednoho statického klienta v globálním oboru. Další informace najdete v tématu správa připojení ve službě Azure Functions.
Použití async
a await
Při psaní azure Functions v Node.js byste měli napsat kód pomocí klíčových async
slov.await
Psaní kódu pomocí async
await
zpětného volání nebo .then
s .catch
přísliby a místo zpětného volání pomáhá vyhnout se dvěma běžným problémům:
- Vyvolání nezachycených výjimek, které chybově ukončí proces Node.js, což může mít vliv na provádění jiných funkcí.
- Neočekávané chování, například chybějící protokoly
context.log
, způsobené asynchronními voláními, která nejsou správně očekávána.
V následujícím příkladu je asynchronní metoda fs.readFile
vyvolána s funkcí zpětného volání typu error-first jako jeho druhý parametr. Tento kód způsobuje oba dříve uvedené problémy. Výjimka, která není explicitně zachycena ve správném oboru, může dojít k chybě celého procesu (problém č. 1). Vrácení bez zajištění, že zpětné volání skončí, znamená to, že odpověď HTTP někdy bude mít prázdný text (problém č. 2).
// DO NOT USE THIS CODE
const { app } = require('@azure/functions');
const fs = require('fs');
app.http('httpTriggerBadAsync', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
let fileData;
fs.readFile('./helloWorld.txt', (err, data) => {
if (err) {
context.error(err);
// BUG #1: This will result in an uncaught exception that crashes the entire process
throw err;
}
fileData = data;
});
// BUG #2: fileData is not guaranteed to be set before the invocation ends
return { body: fileData };
},
});
V následujícím příkladu je asynchronní metoda fs.readFile
vyvolána s funkcí zpětného volání typu error-first jako jeho druhý parametr. Tento kód způsobuje oba dříve uvedené problémy. Výjimka, která není explicitně zachycena ve správném oboru, může dojít k chybě celého procesu (problém č. 1). Volání zastaralé context.done()
metody mimo rozsah zpětného volání může signalizovat, že funkce je dokončena před čtením souboru (problém č. 2). V tomto příkladu volání context.done()
příliš brzy způsobí chybějící položky protokolu začínající na Data from file:
.
// NOT RECOMMENDED PATTERN
const fs = require('fs');
module.exports = function (context) {
fs.readFile('./hello.txt', (err, data) => {
if (err) {
context.log.error('ERROR', err);
// BUG #1: This will result in an uncaught exception that crashes the entire process
throw err;
}
context.log(`Data from file: ${data}`);
// context.done() should be called here
});
// BUG #2: Data is not guaranteed to be read before the Azure Function's invocation ends
context.done();
}
async
Pomocí klíčových slov a await
těchto klíčových slov se můžete vyhnout oběma těmto problémům. Většina rozhraní API v ekosystému Node.js byla v nějaké podobě převedena na přísliby podpory. Například od verze 14 Node.js poskytuje fs/promises
rozhraní API pro nahrazení rozhraní API zpětného fs
volání.
V následujícím příkladu všechny neošetřené výjimky vyvolané během provádění funkce pouze selžou jednotlivá vyvolání, která vyvolala výjimku. Klíčové await
slovo znamená, že následující readFile
kroky se spustí až po jeho dokončení.
// Recommended pattern
const { app } = require('@azure/functions');
const fs = require('fs/promises');
app.http('httpTriggerGoodAsync', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
try {
const fileData = await fs.readFile('./helloWorld.txt');
return { body: fileData };
} catch (err) {
context.error(err);
// This rethrown exception will only fail the individual invocation, instead of crashing the whole process
throw err;
}
},
});
S async
a await
, nemusíte také volat context.done()
zpětné volání.
// Recommended pattern
const fs = require('fs/promises');
module.exports = async function (context) {
let data;
try {
data = await fs.readFile('./hello.txt');
} catch (err) {
context.log.error('ERROR', err);
// This rethrown exception will be handled by the Functions Runtime and will only fail the individual invocation
throw err;
}
context.log(`Data from file: ${data}`);
}
Odstraňování potíží
Přečtěte si průvodce odstraňováním potíží s Node.js.
Další kroky
Další informace naleznete v následujících zdrojích: