为何Tags.findOne()报TypeError且/addtag命令误判标签存在?
Discord机器人标签命令问题分析与修复
一、/tag命令报错TypeError: Cannot read properties of undefined (reading 'findOne')的原因
- 模型导入逻辑错误:
models/tag.js导出的是一个用于定义模型的函数,而非直接导出Tags模型。命令文件中直接const { Tags } = require('../models/tag.js')会导致Tags变量为undefined,自然无法调用findOne方法。 - 异步操作未正确处理:
Tags.findOne()是异步函数,未添加await关键字会直接返回Promise对象,后续的存在性判断逻辑也会失效。
修复方式:
- 统一数据库模型管理:在数据库初始化文件(如
db-init.js)中,将定义好的模型挂载到db对象上,示例:
const { Sequelize, DataTypes } = require('sequelize'); const db = new Sequelize({ dialect: 'sqlite', storage: './database.sqlite', }); // 定义模型并挂载到db db.Tags = require('./models/tag.js')(db, DataTypes); const force = process.argv.includes('--force') || process.argv.includes('-f'); db.sync({ force }).then(async () => { console.log('Database synced.'); db.close(); }).catch(console.error);
之后在命令文件中从db导入Tags:
const { Tags } = require('../db-init.js');
- 给异步查询添加
await:
const tag = await Tags.findOne({where: { name: name } });
二、/addtag命令误提示标签已存在的原因
错误捕获分支中使用了赋值操作符=而非相等判断符===:
if (error.name = 'SequelizeUniqueConstraintError')
这行代码会将字符串赋值给error.name,赋值表达式的结果永远为true,导致无论发生何种错误,都会返回“标签已存在”的提示。
修复方式:将=替换为===:
if (error.name === 'SequelizeUniqueConstraintError')
内容的提问来源于stack exchange,提问作者TacoSnack
相关产品推荐
相关产品推荐

