добавление свойств и методов к объекту в другом файле js - PullRequest
0 голосов
/ 12 января 2019

Я создаю config.js файл, содержащий объект, известный как contextTokenObject

//This holds context information or the information which will be transferred at various places of the app 

let contextToken = {}

module.exports = {
    contextToken
}

Теперь я хочу добавить свойство и методы к этому объекту контекста из другого файла (когда я создаю стратегию паспорта)

Вместо вставки всего кода рассмотрим passport.js file В этом файле passport.js

Я импортирую объект токена контекста в этом файле.

const contextObject = require("./config.js") 

Теперь, скажем, я хочу добавить следующее свойство к моему вышеуказанному объекту

let TokenToStore = { "googleRefreshToken": refreshToken, "`googleAccessToken": accessToken, "expires_in": params.expires_in}`   

Вопрос: Как я могу это сделать?

Обновление: что я пробовал. Как упоминалось выше, я создал объект и импортирую его в свою стратегию паспорта

const contextObject = require("./../config/context.js")

затем в обратном вызове паспорта я делаю что-то вроде этого

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL:  process.env.GOOGLE_CALLBACK_URL,
    userProfileURL: 'https://www.googleapis.com/oauth2/v3/userinfo',
    accessType: 'offline'
  }, (accessToken, refreshToken, params, profile, cb) => { 
        //Sorting the data we recieve and removing unwanted stuff 
        let profileSort = authHelper.extractGmailProfile(profile)
        //Update refresh token whenever recieved
        let TokenToStore = { "googleRefreshToken": refreshToken, "googleAccessToken": accessToken, "expires_in": params.expires_in}    
        //Context object 
        contextObject.contextToken["googleToken"] = TokenToStore

Это выбрасывает следующую ошибку

Невозможно установить свойство 'googleToken' из неопределенного

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

У вас есть несколько способов сделать это.

Первый в node.js будет экспортировать / определить этот объект как глобальный. Таким образом, вам даже не нужно больше импортировать его в разные файлы. Я сразу скажу вам, что это решение, даже если оно работает, и это довольно прямолинейно, не мое предпочтение. Глобальные переменные являются злом в любом случае .

Тогда, конечно, это может зависеть от случая, но обычно это не лучшая практика для использования. Это действительно ошибка, склонная к деликатности. Например, новый модуль может легко переопределить вашу глобальную переменную.

Кстати, вы можете сделать это следующим образом:

global.contextObject = { ... };

И тогда вы можете использовать его прямо в ваших файлах. Поэтому, если вы хотите добавить реквизит в другой файл, вы можете сделать что-то вроде:

contextObject.TokenToStore = {
  "googleRefreshToken": refreshToken, 
  "googleAccessToken": accessToken, 
  "expires_in": params.expires_in
};

Другой способ сделать это - использовать prototype, но вы должны немного изменить свой синтаксис при определении obj, чтобы использовать конструктор функции, в противном случае используйте прототип для добавления реквизитов через литерал объекта. приведет к назначению новых реквизитов для всех объектов, как вы можете видеть ниже:

const obj = { firstProp: 'I am a first prop' };
console.log(obj);
Object.getPrototypeOf(obj).secondProp = 'I am a second prop';
console.log(obj);
const obj2 = { test: 'I am a test' };
console.log(obj2);

Итак, правильный способ сделать это будет:

const obj = new function () { 
  this.firstProp = 'I am a first prop';
  return this; 
};
console.log(obj);
// then export your obj
// In the other file import back your obj and add things to the prototype
Object.getPrototypeOf(obj).secondProp = 'I am a second prop';
console.log(obj);
const obj2 = { test: 'I am a test' };
console.log(obj2);

Последний способ сделать это - просто добавить к объекту простые реквизиты, или, что еще лучше, в тех случаях, когда вы хотите добавить реквизиты к объекту cusotm во многих местах, используйте Object.defineProperty для их определения, что дает вам гораздо больше возможностей для новых реквизита.

Например, вы можете захотеть, чтобы новые реквизиты, которые вы назначаете в новом объекте, не могли быть изменены в каком-либо другом файле, поэтому невозможно добавить реквизиты с буквальным синтаксисом.

Пример ниже:

const obj = { firstProp: 'I am a first prop' };
console.log(obj);
// then export it
// import it somewhere else
obj.secondProp = 'I am a second prop';
console.log(obj);
// or assign it with defineProperty
Object.defineProperty(obj, 'secondProp', {
  value: 'I am a not changable second prop',
  writable: false
});
console.log(obj);
// the following will be ignored
obj.secondProp = 'new value';
console.log(obj);

Какой лучший способ взять? Это действительно зависит от вашего варианта использования.

Я бы избегал глобальных переменных, и я бы избегал литералов, поэтому я бы выбрал прототипы и специально использовал defineProperty для новых реквизитов в этих случаях. Но это действительно зависит от вас. Все они достигают того, что вы ищете.

0 голосов
/ 12 января 2019

contextObject.googleRefreshToken = refreshToken и т. Д.
или
newContextObject = Object.assign(contextObject, refreshToken);

или es6 way

newContextObject = { ...contextObject, ...refreshToken }

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