TypeError:usert.addItem 不是函数
Posted
技术标签:
【中文标题】TypeError:usert.addItem 不是函数【英文标题】:TypeError: usert.addItem is not a function 【发布时间】:2019-06-17 15:22:14 【问题描述】:尝试使用 discord.js 制作一个不和谐机器人。我正在使用 sequelize 和 sqlite 创建一个数据库来存储数据。自定义函数似乎不起作用,终端在实际定义时认为它不是函数。对此可能有一个非常明显的解决方案,但我非常业余,我经常遇到错误,但通常会修复它们。这个我连问题的根源都无法确定
这个问题也适用于其他自定义函数
最令人困惑的是,对于另一个完全用于另一个机器人的文件夹,具有非常相似的代码和基本相同的自定义功能,它可以工作!但是由于某种原因,它在这里不起作用。
// Defining these
const Users, ItemDB = require('./dbObjects');
// The command that uses the function. It is worth noting that it finds the item and user successfully, proving that the problem is in users.addItem
const item = await ItemDB.findByPk(1);
const usert = Users.findByPk(message.author.id);
usert.addItem(item);
// The addItem function defined, in dbObjects file
Users.prototype.addItem = async function(item)
const useritem = await UserItems.findOne(
where: user_id: this.user_id, item_id: item.id ,
);
if (useritem)
useritem.amount += 1;
return useritem.save();
return UserItems.create( user_id: this.user_id, item_id: item.id, amount: 1 );
;
预期的结果是成功添加到数据库,但终端返回:
(node:21400) UnhandledPromiseRejectionWarning: TypeError: usert.addItem is not a function
在Users.findByPk
之前添加await
会随机返回。
【问题讨论】:
【参考方案1】:由于Users.findByPk(message.author.id)
是一个promise,它将执行返回到下一个序列代码,因此变量const usert
尚未初始化,导致usert.addItem()
不起作用。
您需要将const usert = Users.findByPk(message.author.id)
更改为此usert
才能完全初始化,然后addItem()
函数将可用:
const usert = await Users.findByPk(message.author.id);
【讨论】:
这样做会将 usert 返回为 null 检查 message.author.id 是否包含主键 ID。如果存在,则检查您的数据库表以查看 id 是否存在。 我不明白?相同的确切行适用于不同的文件夹,但此处仍返回 null【参考方案2】:你需要await Users.findByPk(message.author.id);
const Users, ItemDB = require('./dbObjects');
// The command that uses the function. It is worth noting that it finds the item and user successfully, proving that the problem is in users.addItem
const item = await ItemDB.findByPk(1);
const usert = await Users.findByPk(message.author.id);
usert.addItem(item);
// The addItem function defined, in dbObjects file
Users.prototype.addItem = async function(item)
const useritem = await UserItems.findOne(
where: user_id: this.user_id, item_id: item.id ,
);
if (useritem)
useritem.amount += 1;
return useritem.save();
return UserItems.create( user_id: this.user_id, item_id: item.id, amount: 1 );
【讨论】:
执行此操作时返回 null以上是关于TypeError:usert.addItem 不是函数的主要内容,如果未能解决你的问题,请参考以下文章
Kerastuner Randomsearch:TypeError:('关键字参数不理解:','激活')
TypeError:不支持的操作数类型|:'bool'和'Q'[关闭]