在azure函数(js)中,异步/等待调用后的POST请求不起作用

时间:2019-07-17 11:19:31

标签: javascript node.js azure http-post azure-functions

我目前正在使用javascript中的Azure函数。在我的函数中,我首先要从CosmoDB中获取特定元素(这是异步/等待部分)。我得到一个结果,然后我想执行一个https POST请求。但是,我的问题是,它从未完成HTTP请求,而且我真的不知道为什么。我在做什么错了?

(如您所见,我尝试了两种不同的方法来执行请求,一次是使用标准https函数,然后是使用npm request包注释掉了该部分。但是,这两种方法都行不通。)

这是我的代码:

const CosmosClient = require('@azure/cosmos').CosmosClient;
var https = require('https');
var http = require('http');
var request = require('request');

const endpoint = "someEndpoint";
const masterKey = "anymasterkey";

const database = {
    "id": "Database"
};

const container = {
    "id": "Container1"
};

const databaseId = database.id;
const containerId = container.id;

const client = new CosmosClient({
    endpoint: endpoint,
    auth: {
        masterKey: masterKey
    }
});
module.exports = function (context, req) {
    const country = "de";
    const bban = 12345678;
    const querySpec = {
        query: "SELECT * FROM Container1 f WHERE  f.country = @country AND f.bban = @bban",
        parameters: [{
                name: "@country",
                value: country
            },
            {
                name: "@bban",
                value: bban

            }
        ]
    };
    getContainers(querySpec).then((results) => {
        const result = results[0];
            context.log('here before request');

            var options = {
                    host: 'example.com',
                    port: '80',
                    path: '/test',
                    method: 'POST'
            };

            // Set up the request
            var req = http.request(options, (res) => {
                    var body = "";
                    context.log('request');

                    res.on("data", (chunk) => {
                            body += chunk;
                    });

                    res.on("end", () => {
                            context.res = body;
                            context.done();
                    });
            }).on("error", (error) => {
                    context.log('error');
                    context.res = {
                            status: 500,
                            body: error
                    };
                    context.done();
            });
            req.end();

            // request({
            //     baseUrl: 'someURL',
            //     port: 443,
            //     uri: 'someuri',
            //     method: 'POST',
            //     headers: {
            //         'Content-Type': 'text/xml;charset=UTF-8',
            //         'SOAPAction': 'someaction'
            //     },
            //     function (error, response, body) {
            //         context.log('inside request')
            //         if (error) {
            //             context.log('error', error);
            //         } else {
            //             context.log('response');
            //         }
            //     }
            // })
    })

};


async function getContainers(querySpec) {
    const {container, database} = await init();
    return new Promise(async (resolve, reject) => {
        const {
            result: results
        } = await container.items.query(querySpec).toArray();
        resolve(results);
    })
}

async function init() {
    const {
        database
    } = await client.databases.createIfNotExists({
        id: databaseId
    });
    const {
        container
    } = await database.containers.createIfNotExists({
        id: containerId
    });
    return {
        database,
        container
    };
}

发生的最后一件事是打印“在请求之前”。在那之后,该功能直到超时才起作用。那我在做什么错?我不能只是等待/异步和请求的组合吗?

1 个答案:

答案 0 :(得分:1)

如前所述,您没有向POST呼叫发送任何数据。您需要在req.write之前有一个req.end

req.write(data);
req.end();

这就是为什么POST呼叫失败的原因。修复之后,它应该可以工作