Я пишу свою самую первую облачную функцию, которая заменяет слово «счастливый» улыбкой.
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
, и заменить его письменным текстом, а текст заменить эмодзи.Что-то вроде:
Но он использовал set()
вместо update()
, что не показывало никаких признаков изменения чего-либо.