Discord.js 无法永远在服务器上使用 process.env 启动机器人,但它可以通过 Visual Studio 在我的本地驱动器上正常工作

Posted

技术标签:

【中文标题】Discord.js 无法永远在服务器上使用 process.env 启动机器人,但它可以通过 Visual Studio 在我的本地驱动器上正常工作【英文标题】:Discord.js can't launch bot with process.env on the server with forever, but it works on my local drive via Visual Studio without problems 【发布时间】:2021-11-12 15:33:26 【问题描述】:

我在服务器上启动机器人时遇到问题,永远... 我使用process.env 存储 BOT 令牌和 Instagram 登录凭据。 但是在服务器上,由于此错误,我无法使机器人工作..

(node:30365) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
ig-bot/node_modules/discord.js/src/client/Client.js:228
    if (!token || typeof token !== 'string') throw new Error('TOKEN_INVALID');
                                                   ^

Error [TOKEN_INVALID]: An invalid token was provided.
    at Client.login (ig-bot/node_modules/discord.js/src/client/Client.js:228:52)
    at Object.<anonymous> (ig-bot/ig.js:64:8)
    at Module._compile (node:internal/modules/cjs/loader:1092:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47 
  [Symbol(code)]: 'TOKEN_INVALID'

error: Forever detected script exited with code: 1
error: Script restart attempt #1
ig-bot/node_modules/discord.js/src/client/Client.js:228
    if (!token || typeof token !== 'string') throw new Error('TOKEN_INVALID');
                                                   ^

Error [TOKEN_INVALID]: An invalid token was provided.
    at Client.login (ig-bot/node_modules/discord.js/src/client/Client.js:228:52)
    at Object.<anonymous> (ig-bot/ig.js:64:8)
    at Module._compile (node:internal/modules/cjs/loader:1092:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47 
  [Symbol(code)]: 'TOKEN_INVALID'

error: Forever detected script exited with code: 1

它说令牌无效,但它确实没有任何意义,因为它可以在我的 PC 上运行,我可以毫无问题地通过 Visual Studio 运行代码。机器人的同一文件夹在我的服务器上运行时出现问题(通常我使用 config.json 作为令牌,但这次我需要 .env 文件)

//处理ENV代码

const dotenv = require('dotenv');
dotenv.config( path: './process.env' );
const username = process.env.IGUSERNAME
const password = process.env.IGPASSWORD
const TOKEN = process.env.TOKEN

client.login(TOKEN);

我试过 ENV=production forever start yourApp.js forever -c "node -r dotenv/config" --workingDir app-workdir-path start app.js 但这些都不适合我...

【问题讨论】:

【参考方案1】:

根据这个答案,我相信你应该这样做sudo IS_PROD=1 forever start yourapp.js

Node.js forever with environment variable

【讨论】:

同样的问题...这也不起作用 老实说,我在根目录中使用带有 .env 文件的 PM2(类似于永远),我没有遇到任何问题...当我在周围搜索时,人们只是说要像你一样运行它将使用环境变量运行常规节点 不确定 PM2 是什么,我一直很好,但我找不到让它工作的方法...... NODE_ENV=production forever ig-bot/ig.js 也无法正常工作。 .. PM2 是一个流程管理器,可让您无限期地运行。尝试通过像ENV=production forever start yourApp.js这样的命令行传递你的环境变量,但它可能永远不喜欢dotenv或环境变量 呃,这真的很奇怪......我尝试了简单的节点 ig-bot/ig.js,它说同样的错误......无效的令牌..但它实际上没有意义,它的字面意思是一样的通过 Visual Studio Code 在我的桌面上运行的副本...我不明白到底发生了什么。【参考方案2】:

几个小时后,我找到了解决方案。

const path = require('path')
require('dotenv').config( path: path.resolve(__dirname, '.env') )

此代码将强制从您的脚本目录运行您的.env 文件。 console.log(__dirname) 会将您的 path 返回到 .js 文件。它解决了整个问题。

//Full code example

const path = require('path')
require('dotenv').config( path: path.resolve(__dirname, '.env') )
const TOKEN = process.env.TOKEN
 
const  Client, Intents  = require('discord.js');

const client = new Client( intents: [Intents.FLAGS.GUILDS] );

client.on('ready', () => 
    client.user.setActivity("WE DID IT!",  type: 'PLAYING' );
    client.guilds.cache.forEach(guild => 
    let channel = guild.channels.cache.get('channelID')
    channel.send(`I'm finally ready!`);
    console.log('Wohoo! Bot is online!')
    )
)

// Login to Discord with your client's token
client.login(TOKEN);

【讨论】:

以上是关于Discord.js 无法永远在服务器上使用 process.env 启动机器人,但它可以通过 Visual Studio 在我的本地驱动器上正常工作的主要内容,如果未能解决你的问题,请参考以下文章

discord.js 成员计数 - 无法读取未定义的属性“通道”

TypeError: command.execute 在捕获错误时不是函数。此外,冷却不起作用。在 Discord.js 上

Discord.js 无法在 Ubuntu 18.04 上播放 mp3 文件

无法发送嵌入和组件 discord.js v13

从 v11 迁移后,无法在 discord.js v12 中从服务器设置用户状态和记录用户数量

Discord.js :将特定服务器上的角色添加到 DM 机器人的用户