You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:30:12