【问题标题】:NodeJS Undefined TypeError, where am I going wrong?NodeJS Undefined TypeError,我哪里出错了?
【发布时间】:2018-11-09 15:26:15
【问题描述】:

我正在尝试在 NodeJS 中创建多个用户对象并将它们存储在地图中。这些将由我正在开发的聊天机器人使用。

基本上应该发生的事情是这样的:

  1. 用户第一次与聊天机器人交互时会触发“FACEBOOK_WELCOME”回发。如果用户存在(即他们以前使用过,可能在另一台设备上),那么他们将开始正常使用聊天机器人,如果用户不存在,他们将需要创建用户配置文件
  2. 如果用户存在,后续交互将使用现有用户配置文件,从地图对象读取或从数据库读取然后存储在地图对象中。

我的用户代码如下所示:

'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 个人资料中获取用户的名字。

【问题讨论】:

  • 试试 this.loadedUsers
  • 我认为您在这里发布了不相关的代码。您需要添加调用函数的部分

标签: node.js object


【解决方案1】:

我想通了。调用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) {

这意味着当我在第 15 行调用 user.addNewUser(senderID, name) 时,代码不是调用用户模块中的 addNewUser() 函数,而是尝试调用 user 中的 addNewUser(senderID, name) 函数,该函数在回调中传递在第 1 行。这当然不存在。当我将第 1 行更改为阅读 getUser(senderID, function(result) { 时,它运行良好。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2011-03-14
    • 2013-12-25
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多