Облачная функция работает локально, но не после ее развертывания. - PullRequest
0 голосов
/ 31 мая 2018

Я пишу свою самую первую облачную функцию, которая заменяет слово «счастливый» улыбкой.

const functions = require("firebase-functions");
const admin = require('firebase-admin');

admin.initializeApp();

exports.emojify = functions.database.ref("/messages/{pushId}/text").onWrite((change, context) => {
    const original = change.before.val();
    const emojified = emojifyText(original);

    return admin.database().ref().set(emojified);
});

function emojifyText(text) {
    let t = text;
    t = t.replace(/\b(H|h)appy\b/ig, "?");

    console.log("Result:", t);

    return t;
};

Я обнаружил, что могу проверить перед развертыванием, запустив firebase functions:shell и выполнив следующее:

firebase > emojify({ before: "Happy!" })
'Successfully invoked function.'
firebase > info: User function triggered, starting execution
info: Result: ?!
info: Execution took 2949 ms, user function completed successfully

Работает.Однако при тестировании с моим приложением для Android в журналах моей функции будет отображаться:

TypeError: Cannot read property 'replace' of null
    at emojifyText (/user_code/index.js:15:13)
    at exports.emojify.functions.database.ref.onWrite (/user_code/index.js:8:23)
    at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)
    at next (native)
    at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
    at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)
    at /var/tmp/worker/worker.js:716:24
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Я не понимаю.

После некоторых новых попыток мой код выглядит следующим образом:

const functions = require("firebase-functions");
const admin = require('firebase-admin');

admin.initializeApp();

exports.emojify = functions.database.ref("/messages/{pushId}/text").onWrite((change, context) => {
    // if (!change.before.val()) { return null; } 
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // I tried with this and without it, but neither helped.

    const original = change.after.val();
    const emojified = original.replace(/\b(H|h)appy\b/ig, "?");

    return admin.database().ref("/messages/{pushId}/text").update(emojified);
});

Самым близким, что я получил, было на самом деле заставить его стереть все в базе, включая путь messages, и заменить его письменным текстом, а текст заменить эмодзи.Что-то вроде:

enter image description here

Но он использовал set() вместо update(), что не показывало никаких признаков изменения чего-либо.

1 Ответ

0 голосов
/ 31 мая 2018

const original = change.before.val(); - это данные до записи.Поэтому, если в узле "/messages/{pushId}/text" не было данных до того, как вы туда записали, переменная original будет иметь значение null.

Вы должны изменить на:

const original = change.after.val();, что является данными после записи, т.е. ваших новых данных, которые вы хотите "смоделировать".


Обновите, следуя вашим комментариям ниже

Выследует использовать метод update() (doc здесь ) следующим образом:

return admin.database().ref("/messages/" + context.params.pushId + "/").update({ text: emojified });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...