这是我的问题:
我正在尝试使用javascript中的Azure函数来设置http触发器。我已经能够使用POST函数将此数据发布到Cosmosdb中。 我要寻找的CosmosDB示例项目:
{
"id": "POLL:FAVECOLORS:LM:LMBWZ18",
"partition": "POLL:LM",
"value": {
"name": "fave colors poll",
"question": "Which color do you like the most?",
"answers": [
{
"text": "Orange",
"count": 0
},
{
"text": "Yellow",
"count": 0
},
{
"text": "Blue",
"count": 0
}
]
},
"_rid": "<info>",
"_self": "<info>",
"_etag": "\"<info>\"",
"_attachments": "<info>/",
"_ts": <info>
}
我试图通过输入到我的Azure函数中来提取此信息。 这是我的function.json。
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "<MyURL>/{type}/{objname}/{brand}/{site}",
"methods": [
"get",
"post",
"patch"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"name": "CosmosSend",
"type": "documentDB",
"databaseName": "PropDB",
"collectionName": "WithoutCCN",
"createIfNotExists": false,
"connection": "<Connection-Info>",
"direction": "out"
},
{
"type": "documentDB",
"name": "documents",
"databaseName": "PropDB",
"collectionName": "WithoutCCN",
"connection": "<Connection-Info>",
"direction": "in",
"sqlQuery": "SELECT * FROM c WHERE c.id = {id}"
}
],
"disabled": false
}
我不确定如何更改请求格式,以便它使用查询的请求参数而不是查找“ https:/// {type} / {objname} / {brand} / {site}? id = POLL:FAVECOLORS:LM:LMBWZ18“
module.exports = function (context, req) {
var documents = context.bindings.documents;
var totalDocuments = documents.length;
var azureAppId = req.headers["azure-app-id"];
context.log('azure-app-id = ' + azureAppId);
var idx = '' + (req.params.type + ':' + req.params.objname + ':' + req.params.brand + ':' + req.params.site).toUpperCase();
var paritionx = '' + (req.params.type + ":" + req.params.brand).toUpperCase();
var valuex = req.body;
if (req.method === 'GET') {
context.log('Found '+ totalDocuments +' documents');
if(totalDocuments === 0)
{
context.done(null, createResult(200, 'application/json', "The
requested document was not found."));
}
else {
context.done(null, createResult(200, 'application/json', documents));
}
} else if (req.method === 'POST') {
if (typeof req.body === 'object') {
context.bindings.CosmosSend = JSON.stringify({
id: idx,
partition: paritionx,
value: valuex
});
context.done(null, createResult(201, 'application/json', req.body));
}
else {
context.done(null, createResult(400, 'text/plain', 'The message must be of type application/json.'));
}
我试图将变量'idx'放入查询中,因为它已经与POST发送'id'的格式相同,但是由于它不属于function.json本身,因此无法被发现。如果我将函数中的查询更改为:
"sqlQuery": "SELECT * FROM c WHERE c.id = /"{TYPE}:{OBJNAME}:{BRAND}:{SITE}/""
和任何遥不可及的东西都认为它不起作用。如果我将想要的东西完全塞进去了:
"sqlQuery": "SELECT * FROM c WHERE c.id = \"POLL:FAVECOLORS:LM:LMBWZ18\""
它每次都能完美地找到它,但是只有一条记录,它违反了GET请求的目的,包括它自己的目标信息。 我确实一直在这个问题上绞尽脑汁,任何提示都将真正有帮助。我已经阅读了很多与Azure函数和javascript相关的Microsoft文档,但是对于解决此特定问题没有任何帮助。
预期结果将是从Azure Function应用发出http GET请求时返回的宇宙项。它将通过位于请求网址中的信息来查找项目。
答案 0 :(得分:0)
您是否尝试过将fields.String(attribute=lambda x: str(EnumGender(x.FieldContainingEnum).name))
作为optional parameter添加到路由中?
id
请记住,即使在不发送ID的POST上,在同一HTTP触发函数中执行此操作也将始终执行查询。因此,您正在消耗未使用的RU。
理想情况下,您可以将其拆分为单独的功能,一个用于POST,一个用于GET,这有助于它们独立扩展,并且您将关注点分离得更大。