typescript - Fel vid uppgradering av Azure Function EventHub-trigger till programmeringsmodell v4. Har detta att göra med den saknade inställningen "dataType": "binary"?


Jag försöker migrera min Azure-funktion från v3 till v4 programmeringsmodell. Om jag försöker trigga den omstrukturerade funktionen får jag följande fel:

[2023-10-24T08:05:30.375Z] Executed 'Functions.location-updates' (Failed, Id=caeb8080-79aa-4230-b7f7-541111ef99bb, Duration=65ms)
[2023-10-24T08:05:30.375Z] System.Private.CoreLib: Exception while executing function: Functions.location-updates. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'eventHubTrigger1'. Microsoft.Azure.WebJobs.Host: Binding parameters to complex objects (such as 'Object') uses Json.NET serialization. 
[2023-10-24T08:05:30.375Z] 1. Bind the parameter type as 'string' instead of 'Object' to get the raw values and avoid JSON deserialization, or
[2023-10-24T08:05:30.376Z] 2. Change the queue payload to be valid json. The JSON parser failed: Unexpected character encountered while parsing value: . Path '', line 0, position 0.

Med programmeringsmodellen v3 specificerade jag "dataType": "binary" i function.json-filen, men med v4 är detta inte möjligt i alternativen för app.eventHub(name, options). Jag tror att detta kan orsaka felet.

Tack för din hjälp!

Svar #1

Triggerkonfigurationer som metoder och AuthLevel, datatyp som tidigare specificerades i en function.json-fil har flyttats till själva koden i V4.

Det har skett några förändringar, och "dataType: binary" används inte längre.

  • Event Hub-triggern förväntar sig att meddelanden deserialiseras som JSON som standard. Om dina Event Hub-meddelanden inte är i JSON-format måste du hantera deserialiseringen själv.

  • För att göra detta bör du binda parametern som en sträng och sedan manuellt deserialisera meddelandet inuti din funktionskod.

module.exports = async function (context, eventHubMessages) {
    for (const message of eventHubMessages) {
    
        // For example, if the message is a binary format, you can decode it to a string
        const decodedMessage = Buffer.from(message, 'base64').toString('utf8');
        
        // Now you can work with the decoded message as a string
        context.log(decodedMessage);
    }
};

I v4, bind parametern som en sträng och hantera manuellt deserialisering av meddelanden om de inte är i JSON-format. För mer information, ta denna länk som referens.