在不同的js文件中向对象添加属性和方法

时间:2019-01-12 07:34:33

标签: javascript node.js express

我正在创建一个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 :(得分:1)

您确实有几种方法可以做到这一点。

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。 但这确实取决于您。 他们所有人都能满足您的需求。

答案 1 :(得分:0)

newContextObject = Object.assign(contextObject, refreshToken);,依此类推,

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

或es6方式

System.currentTimeMillis()