Azure İşlevleri için Node.js programlama modelinin 4. sürümüne geçiş

Bu makalede Node.js programlama modelinin sürüm 3 ile sürüm 4 arasındaki farklar ve mevcut bir v3 uygulamasının nasıl yükseltılacağı açıklanır. Mevcut bir v3 uygulamasını yükseltmek yerine yeni bir v4 uygulaması oluşturmak istiyorsanız Visual Studio Code (VS Code) veya Azure İşlevleri Core Tools öğreticisine bakın. Bu makalede, uygulamanızı yükseltmek için gerçekleştirmeniz gereken en önemli somut eylemleri vurgulamak için "ipucu" uyarıları kullanılır.

Sürüm 4, Node.js geliştiricilerine aşağıdaki avantajları sağlayacak şekilde tasarlanmıştır:

  • Node.js geliştiricilerine tanıdık ve sezgisel bir deneyim sağlayın.
  • Tam özelleştirme desteğiyle dosya yapısını esnek hale getirin.
  • İşlev yapılandırmasını tanımlamak için kod odaklı bir yaklaşıma geçin.

Dikkat edilmesi gereken noktalar

  • Node.js programlama modeli Azure İşlevleri çalışma zamanıyla karıştırılmamalıdır:
    • Programlama modeli: Kodunuzu nasıl yazdığınızı tanımlar ve JavaScript ve TypeScript'e özgüdür.
    • Çalışma zamanı: Azure İşlevleri temel davranışını tanımlar ve tüm dillerde paylaşılır.
  • Programlama modelinin sürümü kesinlikle npm paketinin sürümüne @azure/functions bağlıdır. Çalışma zamanından bağımsız olarak sürümlenmiştir. Hem çalışma zamanı hem de programlama modeli en son ana sürümü olarak 4 sayısını kullanır, ancak bu bir tesadüftür.
  • Aynı işlev uygulamasında v3 ve v4 programlama modellerini karıştıramazsınız. Uygulamanıza bir v4 işlevi kaydettiğiniz anda function.json dosyalarına kayıtlı tüm v3 işlevleri yoksayılır.

Gereksinimler

Node.js programlama modelinin 4. sürümü aşağıdaki en düşük sürümleri gerektirir:

npm paketini dahil et

v4'te npm paketi Node.js @azure/functions programlama modelini destekleyen birincil kaynak kodunu içerir. Önceki sürümlerde bu kod doğrudan Azure'da gönderildi ve npm paketinde yalnızca TypeScript türleri vardı. Şimdi bu paketi hem TypeScript hem de JavaScript uygulamaları için eklemeniz gerekir. Mevcut v3 uygulamaları için paketi ekleyebilirsiniz, ancak bu gerekli değildir.

İpucu

Paketin @azure/functions package.json dosyanızın bölümünde (değildevDependencies) listelendiğinden dependencies emin olun. Aşağıdaki komutu kullanarak v4'ü yükleyebilirsiniz:

npm install @azure/functions

Uygulama giriş noktanızı ayarlama

Programlama modelinin v4'lerinde kodunuzu istediğiniz gibi yapılandırabilirsiniz. Uygulamanızın kökünde ihtiyacınız olan tek dosyalar host.json ve package.json dosyalarıdır.

Aksi takdirde, package.json dosyanızdaki alanı ayarlayarak main dosya yapısını tanımlarsınız. Glob deseni mainkullanarak alanı tek bir dosyaya veya birden çok dosyaya ayarlayabilirsiniz. Aşağıdaki tabloda alan için örnek değerler gösterilmektedir main :

Örnek Açıklama
src/index.js İşlevleri tek bir kök dosyadan kaydedin.
src/functions/*.js Her işlevi kendi dosyasından kaydedin.
src/{index.js,functions/*.js} Her işlevi kendi dosyasından kaydettiğiniz, ancak yine de genel uygulama düzeyinde kod için bir kök dosyanız olduğu bir birleşim.
Örnek Açıklama
dist/src/index.js İşlevleri tek bir kök dosyadan kaydedin.
dist/src/functions/*.js Her işlevi kendi dosyasından kaydedin.
dist/src/{index.js,functions/*.js} Her işlevi kendi dosyasından kaydettiğiniz, ancak yine de genel uygulama düzeyinde kod için bir kök dosyanız olduğu bir birleşim.

İpucu

package.json dosyanızda bir main alan tanımladığınızdan emin olun.

Bağımsız değişkenlerin sırasını değiştirme

Çağırma bağlamı yerine tetikleyici girişi artık işlev işleyicinizin ilk bağımsız değişkenidir. Artık ikinci bağımsız değişken olan çağırma bağlamı v4'te basitleştirilmiştir ve tetikleyici girişi olarak gerekli değildir. Kullanmıyorsanız kapalı bırakabilirsiniz.

İpucu

Bağımsız değişkenlerinizin sırasını değiştirin. Örneğin, HTTP tetikleyicisi kullanıyorsanız veya bağlamı (request) kullanmıyorsanız öğesine geçin.(request, context)(context, request)

İşlevinizi kodda tanımlama

Artık bu ayrı function.json yapılandırma dosyalarını oluşturmanız ve korumanız gerekmez. Artık işlevlerinizi doğrudan TypeScript veya JavaScript dosyalarınızda tam olarak tanımlayabilirsiniz. Buna ek olarak, artık birçok özelliğin varsayılan değerleri vardır, böylece bunları her seferinde belirtmeniz gerekmez.

const { app } = require('@azure/functions');

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || (await request.text()) || 'world';

        return { body: `Hello, ${name}!` };
    },
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text()) || 'world';

    return { body: `Hello, ${name}!` };
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: httpTrigger1,
});

İpucu

function.json dosyanızdaki yapılandırmayı kodunuzla taşıyın. Tetikleyicinin türü, yeni modeldeki nesnedeki app bir yönteme karşılık gelir. Örneğin, function.json içinde bir httpTrigger tür kullanıyorsanız, işlevi kaydetmek için kodunuzu çağırınapp.http(). kullanıyorsanız timerTriggerçağrısında bulunur app.timer().

Bağlam kullanımınızı gözden geçirin

v4'te nesne, context yinelemeyi azaltmak ve birim testleri yazmayı kolaylaştırmak için basitleştirilmiştir. Örneğin, birincil girişi ve çıkışı yalnızca işlev işleyicinizin bağımsız değişkeni ve dönüş değeri olarak erişilebilecek şekilde kolaylaştırdık.

Nesnedeki context birincil giriş ve çıkışa artık erişemezsiniz, ancak nesnedeki context ikincil girişlere ve çıkışlara erişmeye devam etmeniz gerekir. İkincil girişler ve çıkışlar hakkında daha fazla bilgi için bkz . Node.js geliştirici kılavuzu.

Birincil girişi bağımsız değişken olarak alma

Birincil giriş tetikleyici olarak da adlandırılır ve tek gerekli giriş veya çıkıştır. Bir (ve yalnızca bir) tetikleyiciniz olmalıdır.

Sürüm 4, ilk bağımsız değişken olarak tetikleyici girişini almanın yalnızca bir yolunu destekler:

async function httpTrigger1(request, context) {
  const onlyOption = request;
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
  const onlyOption = request;

İpucu

Girişi almak için veya context.bindings kullanmadığınızdan context.req emin olun.

Birincil çıkışı dönüş değeriniz olarak ayarlayın

Sürüm 4, birincil çıkışı dönüş değeri aracılığıyla ayarlamanın tek bir yolunu destekler:

return { 
  body: `Hello, ${name}!` 
};
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    // ...
    return { 
      body: `Hello, ${name}!` 
    };
}

İpucu

Çıktıyı nesneyle ayarlamak yerine her zaman işlev işleyicinizde döndürdiğinizden context emin olun.

Bağlam günlüğü

v4'te, aşağıdaki örnekte gösterildiği gibi günlük yöntemleri kök context nesneye taşındı. Günlüğe kaydetme hakkında daha fazla bilgi için bkz . Node.js geliştirici kılavuzu.

context.log('This is an info log');
context.error('This is an error');
context.warn('This is an error');

Test bağlamı oluşturma

Sürüm 3, Azure İşlevleri çalışma zamanı dışında bir çağrı bağlamı oluşturmayı desteklemez, bu nedenle birim testleri yazmak zor olabilir. Sürüm 4, siz eklemediğiniz sürece testler sırasındaki bilgiler ayrıntılı olmasa da çağırma bağlamının bir örneğini oluşturmanıza olanak tanır.

const testInvocationContext = new InvocationContext({
  functionName: 'testFunctionName',
  invocationId: 'testInvocationId'
});

HTTP türleri kullanımınızı gözden geçirin

HTTP isteği ve yanıt türleri artık getirme standardının bir alt kümesidir. Bunlar artık Azure İşlevleri için benzersiz değildir.

Türler Node.js dosyasında paketini kullanır undici . Bu paket getirme standardına uyar ve şu anda Node.js core ile tümleştiriliyor .

HttpRequest

  • Gövde. Gövdeye erişmek için almak istediğiniz türe özgü bir yöntem kullanabilirsiniz:

    const body = await request.text();
    const body = await request.json();
    const body = await request.formData();
    const body = await request.arrayBuffer();
    const body = await request.blob();
    
  • Üst Bilgi:

    const header = request.headers.get('content-type');
    
  • Sorgu parametresi:

    const name = request.query.get('name');
    

HttpResponse

  • Durum:

    return { status: 200 };
    
  • Gövde:

    body veya Buffergibi string çoğu türü döndürmek için özelliğini kullanın:

    return { body: "Hello, world!" };
    

    jsonBody JSON yanıtı döndürmenin en kolay yolu için özelliğini kullanın:

    return { jsonBody: { hello: "world" } };
    
  • Üst bilgi. Sınıfı mı HttpResponseInit yoksa arabirimi mi kullandığınıza HttpResponse bağlı olarak üst bilgiyi iki şekilde ayarlayabilirsiniz:

    const response = new HttpResponse();
    response.headers.set('content-type', 'application/json');
    return response;
    
    return {
      headers: { 'content-type': 'application/json' }
    };
    

İpucu

HTTP isteğini veya yanıt türlerini kullanarak tüm mantığı yeni yöntemlerle eşleşecek şekilde güncelleştirin.

İpucu

HTTP isteğini veya yanıt türlerini kullanarak tüm mantığı yeni yöntemlerle eşleşecek şekilde güncelleştirin. Eski yöntemleri kullanıp kullanmadığınızı belirlemenize yardımcı olması için TypeScript derleme hataları almanız gerekir.

Sorun giderme

Node.js Sorun Giderme kılavuzuna bakın.