首页 > 解决方案 > 从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 会像下面这样提到成员。

从机器人接收到应用程序的消息

例如,它与其他属性(例如通道)的工作方式相同。然后用户可以点击那些查看会员信息或直接进入频道等。我希望能够使用它。

标签: javascriptnode.jsstringmongodbmongoose

解决方案


没错,您将无法以 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()已知昵称的字符串硬编码,它应该提供您期望的结果。


推荐阅读