NodeJS Undefined TypeError, где я ошибаюсь? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать несколько пользовательских объектов в 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 просто получает имя пользователя из профиля Facebook с помощью Graph.API.

1 Ответ

0 голосов
/ 04 декабря 2018

Я понял это. Часть кода, где вызывается функция 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() в пользовательском модуле, код пытался вызвать функцию addNewUser(senderID, name) в user, которая была передана в обратном вызове в строке 1. Это, конечно, не существует. Когда я изменил строку 1 на getUser(senderID, function(result) {, она работала нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...