Запись из запроса firebase не существует должным образом - PullRequest
0 голосов
/ 28 мая 2020

Я пишу асинхронную c функцию async_unlike_post, используемую для моей HTTP-функции firebase unlike_post формы в index.js. Реализация async_unlike_post сохраняется в другом файле posts.js

index. js

exports.unlike_post = functions
  .https
  .onCall(async_unlike_post);

сообщений. js

const { admin, db } = require("../util/admin");
//admin.initializeApp(config);
//const db = admin.firestore();

const { uuid } = require("uuidv4");

const {
  success_response,
  error_response
} = require("../util/validators");



exports.async_unlike_post = async function(req, res) {
  try {
    const like_snapshot = await db
      .collection('likes')
      .where("liker_id", '==', req.liker_id)
      .where('entity_id', '==', req.entity_id)
      .limit(1).get();

    if (!like_snapshot.exists) {

      console.log("Case 1"); 

      return error_response("Post has not been liked by user");
    }

    const post_document = db.doc(`/posts/${req.entity_id}`);
    const post_snapshot = await post_document.get();

    if (!post_snapshot.exists) {

      console.log("Case 2");
      return error_response("Post not found");
    }

    console.log("Should delete");

    return db.collection("likes").doc(like_snapshot.id).delete();

  } catch (error) {
    return error_response(error);
  }
}



mockLike = {
  liker_id: "string1",
  entity_id: "string2"
}

exports.async_unlike_post(mockLike);

После запуска node posts.js я ожидаю, что документ в моей базе данных Firestore будет удален. Однако на моей консоли говорится, что это относится к случаю 1. В моей базе данных firestore в коллекции likes определенно есть документ со следующими атрибутами.

created_at: Some_timestamp,
entity_id: "string2",
liker_id: "string1",
type: "post"

Может ли кто-нибудь просветить меня, почему выполнение моего кода переходит в Случай 1?

1 Ответ

0 голосов
/ 28 мая 2020

Ваша функция принимает параметры для res и req:

function asyncUnlikePost(req, res)

Однако вы экспортируете функцию onCall, которая не предоставляет такие же аргументы:

exports.unlike_post = functions
  .https
  .onCall(async_unlike_post);

Как видно из документации для вызываемых функций , он предоставляет параметры data и context, а не req и res. Функции onCall отличаются от функций onRequest. Они не «совместимы».

Кроме того, этот вызов здесь:

mockLike = {
  liker_id: "string1",
  entity_id: "string2"
}

exports.async_unlike_post(mockLike);

Не передает обязательные параметры res и req. Вместо этого вы просто передаете какой-то объект. Это не сработает.

...