Выполнение запроса внутри Cloud Function с использованием параметров запроса - PullRequest
0 голосов
/ 20 мая 2019

У меня проблемы с выполнением запросов из облачных функций с использованием параметров запроса для построения запроса HTTP-вызовов. В прошлом я выполнял запросы из облачных функций без ошибок. Моя проблема возникает, когда я пытаюсь выполнить запрос, используя параметры, полученные из запроса.

Когда я жестко кодирую местоположение документа в функции, он работает нормально, но когда я пытаюсь построить запрос, он возвращает код состояния 200. Я также зарегистрировал встроенный запрос, и он правильно выходит из системы. но данные не возвращаются. Он возвращает данные только тогда, когда путь документа жестко закодирован. См. Код ниже.

Query looks like this
https://us-central1-<project-id>.cloudfunctions.net/getData/CollectionName/DocumentName

export const getData = functions.https.onRequest((request, response) => {

    const params = request.url.split("/");
    console.log("the params 0 "+params[0]);
    console.log("the params 1 "+params[1]);
    console.log("the params 2 "+params[2]);

    //Build up the document path
    const theQuery = "\'"+params[1]+"\/"+params[2]+"\'";
    console.log("the query "+theQuery); <-- logs out right result in the form 'Collection/Document'

    //Fetch the document
    const promise = admin.firestore().doc("\'"+params[1]+"\/"+params[2]+"\'").get() <---- This doesnt work, building the query

    //const promise = admin.firestore().doc('collectionName/DocID').get() <---- This hard coded and it works 

    promise.then(snapshot => {
        const data = snapshot.data()
        response.send(data)

    }).catch(error => {
        console.log(error)
        response.status(500).send(error);
    })

});

Я попытался использовать другой подход и присвоить полям данных имена, как показано ниже

Query looks like this
https://us-central1-<project-id>.cloudfunctions.net/getData?CollectionName=CName&DocumentID=Dname


export const getData = functions.https.onRequest((request, response) => {
     const collectName = request.query.CollectionName;

    const DocId = request.query.DocumentName;

    //Build up the document path
    const theQuery = "'"+collectName+"\/"+collectName+"'";
    console.log("the query "+theQuery); <---Logs out correct result

    //Fetch the document
    const promise = admin.firestore().doc(theQuery).get() <-- Building the query does not work

//const promise = admin.firestore().doc('collectionName/DocID').get() <---- This hard coded and it works 

    promise.then(snapshot => {
        const data = snapshot.data()
        response.send(data)

    }).catch(error => {
        console.log(error)
        response.status(500).send(error);
    })

});

В обоих случаях, когда запрос строится из URL, он не возвращает никаких данных и не возвращает никаких ошибок. И я уверен, что документы, которые я пытаюсь получить, существуют в базе данных. Я что-то упустил?

1 Ответ

0 голосов
/ 20 мая 2019

Попробуйте request.path. Затем вы можете получить компоненты пути, например, request.path.split("/")[1]

Синтаксис для request.query действителен при использовании Express . Это упоминается в некоторых документах, но не указывается явно, что требуется Express. Это сбивает с толку.

Чтобы правильно обрабатывать динамические входы, вам может повезти с работой в Express и созданием маршрутов и обработчиков. На этой странице Firebase есть ссылки на некоторые проекты, использующие ее.

Хотя настройка с использованием Express на Firebase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...