首页 > 解决方案 > 在 Azure 函数中返回正文

问题描述

我需要一点帮助。我正在创建一个 Azure 函数来使用 NodeJS 生成令牌。下面是我创建的函数。

const { response } = require('request');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');

var request = require('request');
var options = {
    'method': 'POST',
    'url': 'https://abc.onbmc.com/api/jwt/login',
    'headers': {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'keep-alive'
    },
    form: {
        'username': 'abc@xyz.com',
        'password': 'password123'
    }
};
request(options, function (error, response) {
    if (error) throw new Error(error);
    console.log(response.body);
    context.res = {
        //status: 200, /* Defaults to 200 */
        body: response.body
    };
}
)
}

我能够通过显示所需的输出,console.log但无法在响应正文中显示它。响应正文仅显示请求的 HTTP 已成功完成。

HTTP/1.1 200 OK
Connection: close
Date: Tue, 14 Sep 2021 16:32:39 GMT
Content-Type: text/plain; charset=utf-8
Server: Kestrel
Content-Length: 0

任何帮助表示赞赏。

标签: node.jsazure-functions

解决方案


您不是在等待回复。

当您收到来自“https://abc.onbmc.com/api/jwt/login”的响应时,该函数已经将数据返回给消费者 - 因此 200 OK,即使您在回调中收到错误也是如此. 函数实例在返回响应后继续工作,因此它成功登录回调,但是您将 body 属性分配给已经返回的对象。

为了解决此问题(假设您仍想使用 request 模块),您可以使用 util 模块来承诺它,如下所示:

const util = require('util')
const { response } = require('request');
const requestPromise = util.promisify(request);

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var request = require('request');
    var options = {
        'method': 'POST',
        'url': 'https://abc.onbmc.com/api/jwt/login',
        'headers': {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Connection': 'keep-alive'
        },
        form: {
            'username': 'abc@xyz.com',
            'password': 'password123'
        }
    };
    try {
        const response = await requestPromise(options);
        console.log(response.body);
        context.res = {
            //status: 200, /* Defaults to 200 */
            body: response.body
        };
    } catch (error) {
        // Handle your error here
        throw new Error(error);
    }
}

这样,您正在等待来自所需 URL 的响应。

值得一提:这是直接从 Microsoft 文档处理此类情况的推荐方法:https ://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2#use-异步等待


推荐阅读