javascript - 从json字符串中提取变量
问题描述
语境 :
我正在使用discord.js库和MongoDB(使用 mongoose)制作一个 Discord 机器人。我创建了一个脚本,可以从存储在我的 MongoDB 数据库中的数据中构造消息。例如,如果我的 Discord 服务器上的用户键入“!hello”,它将查询我的数据库以构造一个回复,例如“Hello to you!”。
我将回复消息数据存储在这样的文档中:
{
"command": "!hello",
"content": "Hello to you!"
}
(我自愿省略了一些在我的问题上下文中无用的属性)
并在我的代码中检索它,例如:
let retrievedReply;
await mongo().then(async mongoose => {
try {
let query = {command: message.content};
retrievedReply = await replySchema.findOne(query);
} finally {
mongoose.connection.close();
}
});
message.reply(retrievedReply.content);
我的问题:
现在,想象一下我希望它响应“你好用户名!”。
如果我没有使用来自 mongo 的数据构建我的回复,我可以简单地执行以下操作:
message.reply(`Hello ${message.member.nickname}!`);
或者
message.reply("Hello " + message.member.nickname + "!");
所以,换句话说,使用反引号和${}语法或(但我不喜欢它),拆分我的字符串并连接我的属性值,就像第二个例子一样。
问题是,我们不能以 json 格式(由 MongoDB 使用)在反引号中存储字符串。所以即使我像这样构建我的文档:
{
"command": "hello",
"content": "Hello ${message.member.nickname}!"
}
${message.member.nickname}不会被解释为一个属性值,而是一个简单的字符串。
1000 美元的问题:
如何在我的代码中使用此属性?我考虑过使用正则表达式提取它,但它并没有改变它仍然是一个字符串的事实。有没有办法从字符串“转换”为可用变量?
编辑
由于 Brettski(正确地)问我,这是我想要的一个例子:
message.member.send(`Hello ${message.member}!`);
这里的message.member属性表示 Discord 公会的成员对象。它包含很多东西,比如它对公会的权限、它的角色等。当我们在消息中使用成员对象时,Discord 会像下面这样提到成员。
例如,它与其他属性(例如通道)的工作方式相同。然后用户可以点击那些查看会员信息或直接进入频道等。我希望能够使用它。
解决方案
没错,您将无法以 Mongo 或其他方式存储字符串文字。
尽管我必须在您的字符串中放置一个标记,然后在其内部message.reply()
或之前对其进行替换。
例子:
const helloCommand = {
"command": "hello",
"content": "Hello ~~membernickname~~!"
};
在此示例中,要替换的令牌是~~membernickname~~
你可以使用这样的东西来做替换:
const command = JSON.parse(helloCommand)
message.member.send(command.content.replace('~~membernickname~~', message.member));
发送到send()
命令的结果字符串是相同的。因此,如果昵称是 @brettski,则字符串“Hello @brettski”将被发送到send()
命令。
在您的示例中:
message.reply(`Hello ${message.member.nickname}!`);
那个部分:
`Hello ${message.member.nickname}!`
是一个字符串文字(模板文字)。该函数message.reply()
最终得到的是“Hello Nickname”一个字符串。所以替换应该工作。作为测试,您可以将用于message.reply()
已知昵称的字符串硬编码,它应该提供您期望的结果。
推荐阅读
- mysql - 是直接用k8s statefulsets还是用mysql-operator来部署主从mysql集群?
- reactjs - 无法将 API 响应数据映射到 typescript 接口
- vb.net - 从共享函数中获取父类类型
- python - Discord bot 从文本文件中删除一行
- alpine.js - 在 AlpineJS 中事后刷新数据
- php - SQL 插入不适用于多个 WHERE 条件
- interface - 树莓派通过 USB 线(串口)向 Arduino 发送超过 1 个字节(例如整数 1920)的数据
- docusignapi - 如何在docusign api中通过给定的EnvelopeId检索签名者的IP地址
- mysql - 节点 js 喜欢/不喜欢 mysql 的帖子列表
- flutter - 如何使用 GetX 使用 Firestore 流填充列表