Синглтон не сохраняет четность в узле

#node.js

#node.js

Вопрос:

Возникает очень, очень своеобразная проблема:

Когда я запускаю свое приложение node, я устанавливаю свои токены доступа к экземпляру модели следующим образом:

index.js

     const token = new Tokens();
    token.setTokens(access_token, refresh_token);
    console.log(token.getTokens()) // WORKS
 

Затем я вызываю функции получения в моем экземпляре в разных файлах.

RunSchedular.js

 const tokens = Tokens.getInstance();
console.log('sched',tokens.getTokens()) //WORKS
 

API.js

 export const POSTRequest = () => {
    const currentTokens = Tokens.getInstance();
    const refreshToken = currentTokens.getRefreshToken(); // DOES NOT WORK
    const body = {
        method: 'POST',
        headers: 
        {
            "Content-Type": "application/x-www-form-urlencoded",
            "Cache-Control": "no-cache"
        },
        body: qs.stringify({
            client_secret: clientSecret,
            client_id: clientId,
            refresh_token: refreshToken,
            grant_type: 'refresh_token',
            redirect_uri: redirectUri
        })
    };
    return body;
}
 

Моя модель выглядит так:

 let instance = null;
export default class Tokens {
    constructor() {
        if(!instance) {
            instance = this;
        }
        this.accessToken = '';
        this.refreshToken = '';
    }

    getAccessToken() {
        return this.accessToken;
    }

    setAccessToken(value) {
        this.accessToken = value;
    }

    getRefreshToken() {
        return this.refreshToken;
    }

    setRefreshToken(value) {
        this.refreshToken = value;
    }

    getTokens() {
        return { 
            accessToken: this.accessToken, 
            refreshToken: this.refreshToken
            }
        }

    setTokens(accessToken,refreshToken) {
        this.accessToken = accessToken;
        this.refreshToken = refreshToken;
    }

    static getInstance() {
        console.log('instance', instance)
        if(!instance) {
            instance = new Tokens();
        }
        return instance;
    }
};
 

Есть идеи, почему это может происходить? Экземпляр в API.js не возвращает мои токены доступа (токен доступа = » согласно конструктору), где в качестве schedular.js и index.js возвращает мой токен доступа нормально?

Моя модель неверна?

Комментарии:

1. Когда вы вызываете Tokens.getInstance(); POSTRequest функцию, журнал console.log('instance', instance) печатает то, что вы ожидаете, или не определено?

2. @Molda он возвращает обратно ‘null’

3. Только что заметил const refreshToken = currentTokens.getTokens(); , что это неправильно. getTokens возвращает объект, поэтому он должен быть const refreshToken = currentTokens.getRefreshToken()

4. Извините, был отредактирован код. Изменили его обратно. Однако все та же проблема. Как будто он полностью сбрасывается, потому что, когда я регистрирую токен доступа и обновляю токен в консоли, API.js , они пустые (как конструктор hte), а экземпляр равен null.

Ответ №1:

Как вы импортируете Tokens модуль? Если путь отличается, будут импортированы 2 разных модуля.

Например, Г.:

 import { Tokens } from 'src/singletons/Tokens';
 

Будет другим объектом, чем:

 import { Tokens } from './../singletons/Tokens';
 

Дополнительная информация о синглетонах в javascript.

Дополнительная информация о кэшировании модулей в NodeJS.

Комментарии:

1. проблема с учетом регистра при импорте вызвала проблему — такая ошибка новичка

2. Не беспокойтесь, некоторое время назад я несколько часов сталкивался с одной и той же проблемой. Ужасная нишевая функциональность в javascript: (

3. Спасибо! В документации NodeJS есть небольшой раздел, посвященный этому , но эта функциональность имеет большое влияние.