【问题标题】:Discord.js in an Express RESTful APIExpress RESTful API 中的 Discord.js
【发布时间】:2020-07-02 18:05:55
【问题描述】:

我正在尝试在 Express RESTful API 中使用 Discord.js 库。我想知道如何在控制器之间共享客户端,因为客户端是异步初始化的,显然多次调用client.login(...) 是不好的做法。换句话说,我有一个不能多次调用的异步初始化方法,我需要跨多个控制器访问这个客户端。这是我现在正在做的事情:

discord.helper.js

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

const client = new Discord.Client();
client.login(process.env.DISCORD_BOT_TOKEN);

export default client;

我的问题是,因为client.login() 是异步的,但只能调用一次,我无法在假设机器人已经初始化的情况下导入此文件。关于我应该如何构造这个模块以便我可以在假设它已经初始化的情况下多次导入它的任何想法?

【问题讨论】:

    标签: javascript node.js rest express discord.js


    【解决方案1】:

    Client#login 是异步的,但它不会在解析后返回 Client 实例 See here

    只要客户端能够登录,您就可以放心地假定客户端可用,但是如果可能的话,我会让您的 Express 服务器接受客户端的实例。

    import { createServer } from "./server"
    import { Client } from "discord.js"
    
    const client = new Client()
    const app = startServer(client)
    
    client.login(process.env.DISCORD_BOT_TOKEN)
    
    app.listen(3000, () => {
      console.log("Express server is listening on port 3000")
    });
    

    createServer 的示例

    import express from "express"
    
    export const createServer = client => {
      const app = express()
    
      app.get("/", (_, res) => {
        res.send(`${client.user.username} says hello`)
      })
    
      return app
    }
    

    【讨论】:

    • 嗯...这可行,但不适用于像我这样的模块化项目。此外,考虑到 Discord.js 仅用于一条路线,这似乎有点 hacky。
    • 我的“模块化”你的意思是你在monorepo工作吗?如果是这样的话,像这样导出客户端实例应该没问题
    • 这不是monorepo,不。但是,我有调用控制器的路由器调用调用模型的服务,并且模型需要访问 Discord.js 客户端。将客户端通过所有这些级别传递到模型层是没有意义的。
    • 您也可以在模型中导入客户端实例,当您在登录/初始化后导入客户端时,之后可以在任何地方使用(不应再次登录),尝试向您的客户端添加一个就绪事件侦听器,并在控制台记录任何内容,这样您就可以确保它没有多次登录。
    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多