我目前正在使用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
};
}
发生的最后一件事是打印“在请求之前”。在那之后,该功能直到超时才起作用。那我在做什么错?我不能只是等待/异步和请求的组合吗?
答案 0 :(得分:1)
如前所述,您没有向POST
呼叫发送任何数据。您需要在req.write
之前有一个req.end
req.write(data);
req.end();
这就是为什么POST呼叫失败的原因。修复之后,它应该可以工作