Express RESTful API 中的 Discord.js

Posted

技术标签:

【中文标题】Express RESTful API 中的 Discord.js【英文标题】:Discord.js in an Express RESTful API 【发布时间】: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() 是异步的,但只能调用一次,我无法在假设机器人已经初始化的情况下导入此文件。关于我应该如何构造这个模块以便我可以在假设它已经初始化的情况下多次导入它的任何想法?

【问题讨论】:

【参考方案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 客户端。将客户端通过所有这些级别传递到模型层是没有意义的。 您也可以在模型中导入客户端实例,当您在登录/初始化后导入客户端时,之后可以在任何地方使用(不应再次登录),尝试向您的客户端添加一个就绪事件侦听器,并在控制台记录任何内容,这样您就可以确保它没有多次登录。

以上是关于Express RESTful API 中的 Discord.js的主要内容,如果未能解决你的问题,请参考以下文章

利用express搭建一个restful api 服务器

Express—get请求参数 restful API

json 使用Express JS的基本RESTful API

nodejs express restful api插件restframework-express使用

检查 RESTful API 中的用户权限

Express / Node中3个相关类别的RESTful路由结构