javascript - Firebase JS函数似乎将前导空格添加到变量
问题描述
第一篇文章和它的愚蠢让我不寒而栗。
使用 Firebase 在 android 中玩转 Messenger 应用程序。我有一个 Firebase 功能,我正在尝试通过它向接收者发送通知。尝试指定数据库引用时遇到问题。
sendNewMessageNotification
Error: Reference.child failed: First argument was an invalid path = "/Users/${senderUid}". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"
at validatePathString (/srv/node_modules/@firebase/database/dist/index.node.cjs.js:1667:15)
at validateRootPathString (/srv/node_modules/@firebase/database/dist/index.node.cjs.js:1679:5)
at Reference.child (/srv/node_modules/@firebase/database/dist/index.node.cjs.js:13843:17)
at Database.ref (/srv/node_modules/@firebase/database/dist/index.node.cjs.js:15097:48)
at exports.sendNewMessageNotification.functions.database.ref.onCreate (/srv/index.js:24:41)
at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23)
at /worker/worker.js:825:24
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)
我将传入消息记录为(ln 13):
{ blockedByReceiver: false,
concatUserIds: '1CclNhoTiOamWThUTRSQVtNhNpk2Pnwb1pLAh0d1nxpgfdU1HUsYaIA3',
isimage: false,
isseen: false,
message: '66',
receiver: '1CclNhoTiOamWThUTRSQVtNhNpk2',
sender: 'Pnwb1pLAh0d1nxpgfdU1HUsYaIA3',
timesent: 1588645656253,
uid: '-M6XeEOUbGjAU5ut7lQw',
url: '' }
但是当我记录属性转换为的内容时,我看到有一个前导空格(ln 17):
sender: Pnwb1pLAh0d1nxpgfdU1HUsYaIA3 receiver: 1CclNhoTiOamWThUTRSQVtNhNpk2 resulting path: /Users/ Pnwb1pLAh0d1nxpgfdU1HUsYaIA3
函数的完整代码:
exports.sendNewMessageNotification = functions.database.ref('/Chats/{newChat}')
.onCreate(async (change, context) => {
console.log(change.val());
const message=change.val();
const senderUid=message.sender.trim();
const receiverUid=message.receiver.trim();
console.log('sender:', message.sender, ' receiver:', message.receiver, ' resulting path: /Users/', senderUid);
const sender = admin.database().ref('/Users/${senderUid}').once('value');
const receiver = admin.database().ref('/Users/${receiverUid}').once('value');
const blockList = admin.database.ref('/BlockList').orderByChild( "blockerUid").equalTo(receiverUid).once('value');
const results = await Promise.all([sender, receiver, blockList]);
senderSnapshot = results[0];
receiverSnapshot = results[1];
blockerSnapshot = results[2];
blockerSnapshot.forEach( result => {
if (result.blockeeUid == sender.id) {
console.log("message ${message.id} from ${sender.id} blocked by ${receiver.id}");
return snapshot.ref.child("blockedByReceiver").set(true);
}
} );
const payload = {
notification: {
title: 'You have a new message!',
body: '${sender.username} has send you a message.',
icon: iconUrl
}
}
return admin.messaging().sendToDevice(receiver.token, payload)
.then(function(response) {
console.log("New Message notification for message ${message.id} sent successfully to user ${message.receiver}");
})
.catch(function(error) {
console.log("Error encountered sending new message notification for message ${message.id} sent successfully to user ${message.receiver}, error:", error);
});
});
我已经尝试了几种不同的方法,并且整夜环顾四周无济于事,任何帮助将不胜感激。
解决方案
看起来您希望将变量的值插入到字符串中:
'/Users/${senderUid}'
单引号是不可能的。您需要为此使用反引号:
`/Users/${senderUid}`
您应该对所有期望变量插值的字符串进行此更改(我的计数至少为 4 个)。
推荐阅读
- proxy - 在 ubuntu 上使用代理后面的作曲家时出现 OpenSSl 错误
- python - 为短语分配分数
- c# - “值不能为空。参数名称:源”在实体框架上运行嵌套查询时
- processing - 处理 rect() 会导致绘制图像而不是矩形?
- intellij-idea - 如何在 IntelliJ IDEA 的模板中创建不可编辑/锁定的区域
- sql-server-2008 - 我应该如何正确使用 sp_msforeachDB 创建和删除备份
- r - 如何判断一个函数调用了哪些函数?像 traceback() 一样不需要错误?
- javascript - 将模块导出到对象,shell 脚本
- angular - 带有事件发射器的 Angular 动态 Html 模板组件
- ios - PWA iOS 获取 sms: 标签以打开 iMessage