为变量导入文件不呈现嵌入

Posted

技术标签:

【中文标题】为变量导入文件不呈现嵌入【英文标题】:Importing file for variable does not render embed 【发布时间】:2019-11-29 08:52:14 【问题描述】:

我正在创建一个我想用丰富的嵌入响应的机器人。由于我有超过三打不同的参数用于这个命令,我想我可以通过将每个 arg 的嵌入移动到不同的 .js 文件来保持代码干净,然后在适当的 arg 时使用“require”变量调用文件用来。很简单,对吧? 但是,每当我运行文件时,嵌入都不会正确呈现。

我尝试删除前几行,因为我认为那是指定它应该作为消息而不是嵌入发送,只是导致错误消息(如“消息未定义”或“无法发送空消息”)

这是我在主命令文件中使用的代码,当我调用同一文件中的变量时,该代码有效:

  else if (args[0] === 'butterfly') 
    return message.channel.send(require('./butterfly.js'))
  

这是我很确定有问题的第二个文件中的代码:

module.exports = (message) =>  
    message.channel.send(embed: 
        color: 16615352,
        author: 
          name: "TEST",
          url: "https://url.here",
          icon_url: "https://url.here"
        ,
        description: "test",
        thumbnail: 
          url: "https://url.here"
        ,
        fields: [
            name: "Test",
            value: "Test",
            inline: true
          ,
          
            name: "Test2",
            value: "Test2",
            inline: true
          
        ],
      
    );

目前,我可以获取要发送的文本,但它不会呈现为嵌入,我只是获取以“(消息)”开头的代码文本。 我用什么来指定代码应该作为嵌入呈现?

【问题讨论】:

【参考方案1】:

问题:

butterfly.js 中,您将module.exports 声明为一个函数。这意味着 require() 正在返回该函数,但您没有调用它。因此,它实际上并没有被执行。

您还尝试在message.channel.send()message.channel.send() 内部发送消息,这会导致错误。


解决方案:

在此设置中,您会注意到 RichEmbed 构造函数。它简洁明了,而不是显式定义消息选项的embed 属性。然而,要理解的主要是它为什么起作用:一个 embed 是从 butterfly.js 导出的;一个新变量被声明为嵌入,然后在TextChannel.send() 方法中使用。

const  RichEmbed  = require('discord.js');

const embed = new RichEmbed()
  .setColor(16615352)
  .setAuthor('TEST', 'iconURL', 'URL')
  .setDescription('test')
  .setThumbnail('iconURL')
  .addField('Test', 'Test', true)
  .addField('Test2', 'Test2', true);

module.exports = embed;
const embed = require('./butterfly.js');

return message.channel.send(embed)
  .catch(console.error);

补充说明:

如果您像最初尝试那样需要来自另一个文件的函数,这些是如何调用它的示例:

require('./someFunction.js')(params);
const someFunction = require('./someFunction.js');

someFunction(params);

【讨论】:

感谢您的回复!试了一下,嵌入发送成功;但是,是否可以从主文件中引用不同的 .js 文件?正如我所提到的,此命令有许多不同的参数,我正在尝试找到一种方法来发送不同的嵌入,但我无法弄清楚如何使用仅需要这些文件之一的 const 嵌入来做到这一点。这可能是一个完全不同的问题,如果你推荐它,我会单独发一个帖子。 require() 就是这样做的。我不确定我明白你在问什么? 抱歉,我会尽量说得更清楚些。我可以使用一个“嵌入”变量引用不同的文件吗?我想我记得过去曾尝试过,但我收到了一个错误,例如“嵌入已被声明” 啊,好吧。如果要改变embed的值,可以用let声明,用embed = ...赋值。或者,您可以使用var 声明多个相同的embed 变量。具体区别见this answer。 成功!使用 var 并且效果很好。非常感谢!

以上是关于为变量导入文件不呈现嵌入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌入模式的express在猫鼬中传递多个复杂查询以将其呈现为我的ejs文件

base64 嵌入式 PDF 文件不会在 Chrome 中呈现

导入时组件不呈现

如何将 JSON 文件中的数据导入嵌入?

导入另一个文件时,Apollo 反应变量不起作用!为啥?

以编程方式将本地报告呈现给XPS