Вставка функций Firebase для предопределенного ключа - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над проектом iOS, в который встроена база Firebase. Приложение состоит из двух частей: iPhone и аналога для iPad и представляет собой приложение для доставки еды. Когда клиентское приложение iPhone добавляет заказ, поставщик устанавливает для слушателя заказ .value и отображает его соответствующим образом. Для моей указанной проблемы c у меня также включены платежи, и у меня есть вещь под названием pending ордера (только до тех пор, пока платеж не будет принят. Как только это произойдет, отложенные ордера удаляются и переходят в открытые. Это главная проблема, потому что обновленный объект открытого ордера по-прежнему имеет ссылку на старый отложенный и удаленный ордер, и когда я пытаюсь принять заказ на стороне поставщика, я все еще держу ссылку на идентификатор отложенного ордера)

const updatePendingOrderToOpenOrderHandler = async (data, context) => {
    try {
        if (!context.auth) {
            // Throwing an HttpsError so that the client gets the error details.
            throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
        }

        const orderId = data.orderId;
        if (!orderId) {
            throw new Error('There\'s no order id!');
        }
        const ids = orderId.split('/');
        if (ids.length !== 2) {
            throw new Error('The order id is invalid!');
        }
        const vendorID = ids[0];
        const vendorOrderID = ids[1];

        const orderSnapshot = await db.ref(`/orders/vendor/pending/${vendorID}/${vendorOrderID}`).once('value');
        const order = orderSnapshot.val();

        const vendorOpenOrder = await db.ref(`/orders/vendor/open/${vendorID}`).push(order);

        const newOpenOrderId = vendorOpenOrder.key;
        const userId = context.auth.uid;
        if (!userId) {
            throw new Error('There\'s no user id!');
        }

        // delete the pending orders
        await db.ref(`/orders/vendor/pending/${vendorID}/${vendorOrderID}`).remove();
        await db.ref(`/orders/user/${userId}/pending`).remove();

        const newOpenUserOrderId = vendorOrderString(vendorID, newOpenOrderId);

        await db.ref(`/orders/user/${userId}`).update({ 'open' : newOpenUserOrderId});

        // We update the newly created open order with its actual id, because the old id (of the former pending order) is irrelevant now
        // the order status is no longer 'pending', since the payment was approved. so update it to 'submitted' as well
        await db.ref(`/orders/vendor/open/${vendorID}/${newOpenOrderId}`).update({ 
                'id' : newOpenOrderId, 
                'orderStatus': 'submitted'
        });

        return { openUserOrderId: newOpenUserOrderId };
    } catch (error) {
        const { message } = error;
        console.error(error);
        throw new functions.https.HttpsError('aborted', message);
    }
};

Это виновник:


> const vendorOpenOrder = await db.ref(`/orders/vendor/open/${vendorID}`).push(order);

Это когда продавец уведомляет себя и показывает предупреждение о принятии заказа, но у него есть идентификатор из вышеупомянутого удаленного открытого.

Я только обновляю его идентификатор позже (потому что я могу получить идентификатор только что введенного значения после вызова push)

await db.ref(`/orders/vendor/open/${vendorID}/${newOpenOrderId}`).update({ 
                'id' : newOpenOrderId, 
                'orderStatus': 'submitted'
        });

Есть ли способ, которым я могу pu sh с ключ мой или что-то подобное? Я борюсь в течение нескольких дней и до сих пор не нашел решения. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 16 марта 2020

Вы можете сгенерировать ключ Firebase pu sh заблаговременно (он генерируется клиентом, а не сервером) и затем прочитать его в переменную. Затем вы можете опубликовать данные в БД, используя сохраненный ключ.

См .: https://firebase.google.com/docs/database/admin/save-data

// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push();

// Get the unique key generated by push()
var postId = newPostRef.key;

Обновление: Вот пример кода Unity из документации Firebase, который показывает использование .pu sh (). Введите ключ вместе, чтобы получить ключ, который затем будет использован позже.

"Чтобы создать LeaderboardEntry и одновременно обновить его до последней ленты результатов и собственного списка результатов пользователя, игра использует такой код :


private void WriteNewScore(string userId, int score) {
    // Create new entry at /user-scores/$userid/$scoreid and at
    // /leaderboard/$scoreid simultaneously
    string key = mDatabase.Child("scores").Push().Key;
    LeaderBoardEntry entry = new LeaderBoardEntry(userId, score);
    Dictionary<string, Object> entryValues = entry.ToDictionary();

    Dictionary<string, Object> childUpdates = new Dictionary<string, Object>();
    childUpdates["/scores/" + key] = entryValues;
    childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

    mDatabase.UpdateChildrenAsync(childUpdates);
}

В этом примере Pu sh () используется для создания записи в узле, содержащей записи для всех пользователей в ключе / scores / $, и одновременного получения ключа с помощью ключа. Затем ключ может быть используется для создания второй записи в баллах пользователя по адресу /user-scores/$userid/$key.

Используя эти пути, вы можете выполнять одновременное обновление нескольких мест в дереве JSON одним вызовом to UpdateChildrenAsyn c (), например, как в этом примере создается новая запись в обоих расположениях. Одновременные обновления выполняются следующим образом: atomi c: либо все обновления выполнены успешно, либо все обновления не выполнены. "

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