Тело запроса POST не определено с запросом пожарного депо - PullRequest
0 голосов
/ 08 июля 2019

У меня есть следующая облачная функция Firebase, которая проверяет, существует ли имя пользователя в любом документе Firestore.Я использовал POST-запрос на стороне клиента с Context-Type: application / JSON

exports.login = functions.https.onRequest((request, response) => {
    response.set('Access-Control-Allow-Headers', 'Content-Type');
    console.log(request.body);
    let query = admin.firestore().collection("admin").where("username", "==", request.body.username);
    query.get().then(snapshot => {
        let loginStatus = false;
        if (snapshot.length > 0) loginStatus= true;
        response.send(loginStatus);
        return;
    }).catch();
    response.send(<NOT_IMPORTANT>);
})

, если я прокомментировал let query = admin..., я могу правильно зарегистрировать request.body.Но с этой строкой, request.body становится неопределенным, и я не могу использовать его в запросе.Если в запросе я жестко закодирую request.body.username в значение «123», он также работает нормально и возвращает соответствующие документы.Что-то я не так сделал?

1 Ответ

1 голос
/ 10 июля 2019

Я полагаю, что ваша проблема, вероятно, связана с тем, что вы используете асинхронную команду, к тому времени, когда ваша .get() будет полностью оценена, ваш response.send(<NOT_IMPORTANT>) уже сработал и закрыл это требование.

Вам необходимо удалить response.send(<NOT_IMPORTANT>); в конце вашей функции.Дайте .get() время выполнения запроса.

Также относится к теме ... Хотя ваша база данных мала, это, вероятно, не проблема ... но я рекомендую вам следовать рекомендациям, чтобы убедиться, чтоу вашей облачной функции достаточно времени, чтобы запустить , вернув свое обещание.Эти документы включают в себя объяснение:

Возвращая результат .set(), ваша функция гарантированно будет работать до тех пор, пока асинхронная работа по записи строки в базу данных не будет полностью завершена

exports.hello = functions.database.ref('/hello').onWrite(event => {
    // set() returns a promise. We keep the function alive by returning it.
    return event.data.ref.set('world!').then(() => {
        console.log('Write succeeded!');
    });
});

Итак, я предлагаю следующее:

exports.login = functions.https.onRequest((request, response) => {
    response.set('Access-Control-Allow-Headers', 'Content-Type');
    let query = admin.firestore().collection("admin").where("username", "==", request.body.username);
    return query.get().then(snapshot => {
        let loginStatus = false;
        if (snapshot.length > 0) loginStatus= true;
        response.send(loginStatus);
    }).catch(err => {
        console.log(err);
    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...