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:实例Python之间不支持'<'

TypeError:不支持的操作数类型|:'bool'和'Q'[关闭]

TypeError:输入类型不支持 ufunc 'isnan' - seaborn Heatmap

烧瓶登录:TypeError:不支持解码Unicode

TypeError: 'str' 不支持缓冲区接口