node.js - NodeJS Undefined TypeError,我哪里出错了?
问题描述
我正在尝试在 NodeJS 中创建多个用户对象并将它们存储在地图中。这些将由我正在开发的聊天机器人使用。
基本上应该发生的事情是这样的:
- 用户第一次与聊天机器人交互时,它会触发“FACEBOOK_WELCOME”回发。如果用户存在(即他们以前使用过,可能在另一台设备上),那么他们将开始正常使用聊天机器人,如果用户不存在,他们将需要创建用户配置文件
- 如果用户存在,则后续交互使用现有的用户配置文件,从地图对象读取或从数据库读取然后存储在地图对象中。
我的用户代码如下所示:
'use strict';
const self = module.exports = {
loadedUsers: new Map(),
add: function(senderID, data) {
// Code to load an existing user from the database
loadedUsers.set(senderID, new User(data.userID, data.gender, data.age));
},
addNewUser: function(senderID) {
// Code to create a blank user object in order to start creating user profile
loadedUsers.set(senderID, new User());
},
User: function(userID, gender, age) {
if (typeof userID === 'undefined' && typeof gender === 'undefined'
&& typeof age === 'undefined') {
this.userID = userID;
this.gender = gender;
this.age = age;
} else {
this.userID = undefined;
this.gender = undefined;
this.age = undefined;
}
},
};
当我想创建一个全新的空白用户时,我只需调用该addNewUser(senderID)
函数。从理论上讲,这应该在loadedUsers() 映射中添加一个空白用户。但事实并非如此。相反,我收到此错误:
Nov 09 15:16:20 weightmentor app/web.1: /app/app_modules/handler.js:255
Nov 09 15:16:20 weightmentor app/web.1: user.addNewUser(senderID);
Nov 09 15:16:20 weightmentor app/web.1: ^
Nov 09 15:16:20 weightmentor app/web.1: TypeError: Cannot read property 'addNewUser'
of undefined
Nov 09 15:16:20 weightmentor app/web.1: at Timeout._onTimeout
(/app/app_modules/handler.js:255:34)
Nov 09 15:16:20 weightmentor app/web.1: at ontimeout (timers.js:436:11)
Nov 09 15:16:20 weightmentor app/web.1: at tryOnTimeout
(timers.js:300:5)
Nov 09 15:16:20 weightmentor app/web.1: at listOnTimeout
(timers.js:263:5)
Nov 09 15:16:20 weightmentor app/web.1: at Timer.processTimers
(timers.js:223:10)
我不确定为什么会发生此错误。有些东西是未定义的,但问题是,什么?
该函数调用如下:
common.getFBUser(senderID, function(name) {
greetingText = strings.initialGreeting.replace("%USER", name);
delay = common.setDelay(greetingText);
messaging.sendTextMessage(senderID, greetingText);
setTimeout(function() {
// Pause before starting user profile creation
user.addNewUser(senderID);
user.setLoadedUserFirstName(senderID, name);
dialogflow.sendRequest(session.getIDs(), senderID, strings.createUser);
}, delay);
});
请注意,common.getFBUser
仅使用 Graph.API 从 Facebook 个人资料中获取用户的名字。
解决方案
我想通了。调用函数的代码部分addNewUser(senderID)
如下所示:
getUser(senderID, function(result) {
if (common.isDefined(result)) {
// If a user has been returned from the database, add to the usermap.
user.add(senderID, result);
// Once user is added, welcome the user
greetUser(senderID);
} else {
// User has not been returned from the database, this is a new user, so create a user profile
common.getFBUser(senderID, function(name) {
greetingText = strings.initialGreeting.replace("%USER", name);
delay = common.setDelay(greetingText);
messaging.sendTextMessage(senderID, greetingText);
setTimeout(function() {
// Pause before starting user profile creation
user.addNewUser(senderID, name);
dialogflow.sendRequest(session.getIDs(), senderID, strings.createUser);
}, delay);
});
}
});
此代码块的第 1 行最初读取getUser(senderID, function(user) {
这意味着当我user.addNewUser(senderID, name)
在第 15 行调用时addNewUser()
,代码不是调用用户模块中的函数,而是尝试调用在第 1 行的回调中传递的addNewUser(senderID, name)
函数user
。这当然不存在。当我将第 1 行更改为阅读getUser(senderID, function(result) {
时,它工作正常。
推荐阅读
- r - 如何在 R 中自定义 Bland-Altman 图
- javascript - 如何在 React Js 中使用内存路由?使用路线的确切方法是什么?
- mysql - sql触发器确保约会之间的30天不起作用
- r - 通过`read.csv`将数据帧的所有列作为字符读取
- python - 如何在变量中创建占位符以在执行时插入值
- python - 如何查询 sqlalchemy 模型以获取昨天创建的所有记录?
- android - Kotlin 在导航抽屉示例中打开新片段
- node.js - 通过 HTTPS 使用 pm2 在 node.js 上托管 Create-React-App SPA
- bash - Bash 脚本 - 计算时间表的函数
- python - return pickle.load(f) 导致 _pickle.UnpicklingError: could not find MARK while