Discord Bot运行报错SyntaxError: Invalid or unexpected token排查求助
Discord Bot SyntaxError: Invalid or unexpected token 问题解决
问题概述
运行Discord Bot时触发SyntaxError: Invalid or unexpected token,定位到命令注册文件01-regCmds.js中的const localCmds = getLocalCmds();行,注释该行后程序可正常执行后续代码。已知该错误通常由无效符号引发,但自行排查未找到问题点。
错误信息
/src/cmd/misc/.DS_Store:1 SyntaxError: Invalid or unexpected token at internalCompileFunction (node:internal/vm:73:18) at wrapSafe (node:internal/modules/cjs/loader:1175:20) at Module._compile (node:internal/modules/cjs/loader:1219:27) at Module._extensions..js (node:internal/modules/cjs/loader:1309:10) at Module.load (node:internal/modules/cjs/loader:1113:32) at Module._load (node:internal/modules/cjs/loader:960:12) at Module.require (node:internal/modules/cjs/loader:1137:19) at require (node:internal/helpers:121:18) at module.exports (/src/utils/getLocalCmds.js:13:28) at module.exports (/src/events/interactionCreate/handleCmds.js:7:23) Emitted 'error' event on Client instance at: at emitUnhandledRejectionOrErr (node:events:394:10) at process.processTicksAndRejections (node:internal/process/task_queues:84:21) Node.js v20.2.0
相关代码文件
01-regCmds.js
const { testServer } = require('../../../config.json'); const cmdsDiff = require('../../utils/cmdsDiff'); const getAppCmds = require('../../utils/getAppCmds'); const getLocalCmds = require('../../utils/getLocalCmds'); module.exports = async (c) => { try { console.log('working!') //const localCmds = getLocalCmds(); <- problem child const appCmds = await getAppCmds(c, testServer); console.log('working!') for (const localCmd of localCmds) { const { name, description, options } = localCmd; const cmdExist = await appCmds.cache.find((cmd) => cmd.name === name); console.log('working!') if (cmdExist) { if (localCmd.deleted) { await appCmds.delete(cmdExist.id) console.log(`🗑️ Banished \"${name}\"!`) console.log('working!') continue; } if (cmdsDiff(cmdExist, localCmd)) { await appCmds.edit(cmdExist.id, { description, options, }); console.log(`📝 Edited command \"${name}\"`) console.log('working!') } } else { if (localCmd.deleted) { console.log(`⏭️ Skipping command \"${name}\" - Set to delete`) console.log('working!') continue; } await appCmds.create({ name, description, options, }); console.log(`👍 Registered command \"${name}\"`) console.log('working!') } } } catch (error) { console.log(`${error}`); } };
getLocalCmds.js
const getAllFiles = require('./getAllFiles'); module.exports = (exc = []) => { let localCmds = []; const cmdCats = getAllFiles(path.join(__dirname, '..', 'cmd'), true) for (const cmdCat of cmdCats) { const cmdFiles = getAllFiles(cmdCat, false) for (const cmdFile of cmdFiles) { const cmdObj = require(cmdFile); if (exc.includes(cmdObj.name)) { continue; } localCmds.push(cmdObj); } } return localCmds; }
问题定位
从错误信息可明确:Node.js尝试加载/src/cmd/misc/.DS_Store文件时触发语法错误。.DS_Store是Mac OS自动生成的隐藏文件,用于存储文件夹视图配置,并非合法JavaScript文件。问题根源在于getLocalCmds.js中调用的getAllFiles函数未过滤非JS文件,导致系统隐藏文件被当作命令文件加载。
解决方案
方案1:在getLocalCmds.js中过滤非JS文件
修改文件循环逻辑,仅处理.js后缀文件,同时补全遗漏的path模块引入:
const getAllFiles = require('./getAllFiles'); const path = require('path'); module.exports = (exc = []) => { let localCmds = []; const cmdCats = getAllFiles(path.join(__dirname, '..', 'cmd'), true) for (const cmdCat of cmdCats) { const cmdFiles = getAllFiles(cmdCat, false) for (const cmdFile of cmdFiles) { // 只处理.js后缀文件 if (path.extname(cmdFile) !== '.js') continue; // 额外排除.DS_Store(可选,过滤后缀后已覆盖) if (path.basename(cmdFile) === '.DS_Store') continue; const cmdObj = require(cmdFile); if (exc.includes(cmdObj.name)) { continue; } localCmds.push(cmdObj); } } return localCmds; }
方案2:修改getAllFiles函数,仅返回JS文件
如果getAllFiles是自定义工具函数,直接修改它,让它只返回.js后缀文件,从源头避免加载无效文件。
方案3:清理项目中的.DS_Store文件
手动删除项目内所有.DS_Store文件,或使用命令批量清理:
find /your/project/path -name ".DS_Store" -delete
内容的提问来源于stack exchange,提问作者Angerxiety
相关产品推荐
相关产品推荐

