【问题标题】:Microsoft.Azure.WebJobs.Script: Unable to cast object of type 'System.String' to type 'Microsoft.AspNetCore.Http.HttpRequest'. when returnMicrosoft.Azure.WebJobs.Script:无法将“System.String”类型的对象转换为“Microsoft.AspNetCore.Http.HttpRequest”类型。回来的时候
【发布时间】:2020-12-22 17:52:11
【问题描述】:

我有一个用 JS 编写的 Azure 函数,它由服务总线触发并生成文件到 Blob 存储。当我尝试返回 HTTP 结果时,我收到如下错误:

System.Private.CoreLib: Exception while executing function: Functions.categoryMessageConsumer. Microsoft.Azure.WebJobs.Script: Unable to cast object of type 'System.String' to type 'Microsoft.AspNetCore.Http.HttpRequest'.

我不知道为什么结果试图映射到 HttpRequest 对象。

index.ts:

import { AzureFunction, Context, HttpRequest } from '@azure/functions';
...

const serviceBusTopicTrigger: AzureFunction = async function(context: Context, req: HttpRequest) {
    let categoryMessage: CategoryMessage = Object.assign(new CategoryMessage(), req);
    let messageValidationResult = await categoryMessage.validate();
    if(!messageValidationResult.isValid) {
        context.log.error(messageValidationResult.errors);
        return {
            status: 400,
            body: "Unexpected error"
        };
    }

    ...
}

function.json 输出绑定:

...
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
...

host.json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

【问题讨论】:

    标签: javascript typescript azure azure-blob-storage


    【解决方案1】:
    var http = require('https');
    module.exports = function (context, eventHubMessages) {
        context.log(`JavaScript eventhub trigger function called for message array ${eventHubMessages}`);
        
        eventHubMessages.forEach((message, index) => {
            
            function callService(msg) {
                let promise = new Promise((resolve, reject) => {
                    var options = {
                        host: process.env["HOST"],
                        port: process.env["PORT"],
                        path: process.env["PATH"],
                        method: process.env["WEBSERVICE_METHOD"],
                        headers: {
                            'Content-Type': process.env["WEBSERVICE_CONTENT_TYPE"],
                            'x-api-key' : process.env["WEBSERVICE_API_KEY"]
                        }
                    };
                    var response = '';
                    const request = http.request(options, (res) => {
                        res.on('data', (d) => {
                            response += d;
                        })
        
                        res.on('end', (d) => {
                            context.res = {
                                body: response
                            };
                            resolve(response);
                        })
                    });
    
                    request.on('error', (error) => {
                        context.log.error(error);
                        reject(error);
                        context.done();
                    })
                    
                    request.write(msg);
                    request.end();
    
                  });
                  promise.then((response) => {
                    context.log(`mensagge send: ${msg}`);
                    context.log(`response: ${response}`);
                    context.done();
                });
                
            }
            
            callService(message);
        });
    };
    

    这是我的 index.js

    现在是我的 function.js:

    {
      "bindings": [
        {
          "type": "eventHubTrigger",
          "name": "eventHubMessages",
          "direction": "in",
          "eventHubName": "event-hub-name",
          "connection": "CONNECTION_EVENT_HUB",
          "cardinality": "many",
          "consumerGroup": "$Default",
          "dataType": "string"
        },
        {
          "type": "http",
          "direction": "out",
          "name": "$return"
        }
      ]
    }
    

    在 local.settings.json 中,我声明了所有环境变量,如 HOST、PORT、CONNECTION_EVENT_HUB 等。

    【讨论】:

      【解决方案2】:

      这是因为,您的函数可能正在尝试创建另一个它没有预料到的对象。

      正如您提到的响应变量名称为$return 并且它是预期的。而不是这样,编码你的函数如下:

      function.json:

      {
          "disabled": false,    
          "bindings": [
              {
                  "authLevel": "function",
                  "type": "httpTrigger",
                  "direction": "in",
                  "name": "req"
              },
              {
                  "type": "http",
                  "direction": "out",
                  "name": "res"
              }
          ]
      }
      

      JS 代码:

      module.exports = function(context, req) {
          context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
      
          if (req.query.name || (req.body && req.body.name)) {
              context.res = {
                  // status defaults to 200 */
                  body: "Hello " + (req.query.name || req.body.name)
              };
          }
          else {
              context.res = {
                  status: 400,
                  body: "Please pass a name on the query string or in the request body"
              };
          }
          context.done();
      };
      

      function.json中的配置选项,您可以访问herehere

      【讨论】:

        猜你喜欢
        • 2012-09-07
        • 2014-03-14
        • 2017-11-24
        • 1970-01-01
        • 2021-04-26
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多