Node.js OAuth中为何使用var {google}而非var google?
为什么声明
google时要加大括号{}? 嘿,这个问题的核心是ES6的对象解构赋值语法,我给你一步步拆解明白~
首先,你得先搞懂require('googleapis')返回的是什么:这个模块导出的是一个包含多个属性的对象,其中就有我们需要的google属性,它本身又是一个嵌套对象,里面包含auth.OAuth2这些内容。
带大括号的写法:var {google} = require('googleapis')
这是ES6的解构赋值语法,等价于:
var google = require('googleapis').google;
它的作用是直接从模块导出的外层对象里,把google这个属性提取出来,赋值给同名变量google。这时候google变量指向的就是嵌套的那个包含auth属性的对象,所以后续google.auth.OAuth2就能正常访问到OAuth2构造函数。
去掉大括号的写法:var google = require('googleapis')
这时候google变量拿到的是整个模块导出的外层对象,而不是里面的google子对象。这时候你再写google.auth.OAuth2就会报错,因为外层对象根本没有auth这个属性——auth是在google子对象里面的,你得写成google.google.auth.OAuth2才能访问到,显然这不是你想要的写法,所以会出现OAuth2未定义的错误。
举个模拟的例子更直观
我们可以模拟googleapis模块的导出结构:
// 模拟googleapis的模块导出 module.exports = { google: { auth: { OAuth2: function() { /* OAuth2构造函数逻辑 */ } }, // 其他属性... }, // 模块的其他导出... };
这样一看就很清楚了:解构赋值帮你跳过了外层对象,直接拿到了我们需要的google子对象,让代码更简洁也更符合逻辑。
内容的提问来源于stack exchange,提问作者Dishank Jindal
相关产品推荐
相关产品推荐

