googleapis TypeError:authClient.request不是nodejs中的函数
我正在使用谷歌日历googleapis和谷歌身份validation 。 我有抓取calendar event
列表,但当我尝试插入事件,然后它会抛出一个错误,即TypeError: authClient.request is not a function in nodejs.
这是我的代码片段: –
//route.js
... app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email', 'https://www.googleapis.com/auth/calendar'] })); ...
//server/passport.js
... var google = require('googleapis'); var googleAuth = require('google-auth-library'); ... passport.use(new GoogleStrategy({ clientID: configAuth.googleAuth.clientID, clientSecret: configAuth.googleAuth.clientSecret, callbackURL: configAuth.googleAuth.callbackURL, passReqToCallback: true }, function(req, token, refreshToken, profile, done) { ... var clientSecret = configAuth.googleAuth.clientSecret; var clientId = configAuth.googleAuth.clientID; var redirectUrl = configAuth.googleAuth.callbackURL; var auth = new googleAuth(); var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); var tokenObj = { access_token: token, refresh_token: refreshToken } oauth2Client.credentials = tokenObj; req.session.oauth2Client = oauth2Client; var calendar = google.calendar('v3'); calendar.events.list({ auth: oauth2Client, calendarId: 'primary', timeMin: (new Date()).toISOString(), maxResults: 10, singleEvents: true, orderBy: 'startTime' }, function(err, response) { if (err) { console.log('The API returned an error: ' + err) return; } var events = response.items; var googleEvents = []; if (events.length == 0) { console.log('No upcoming events found.'); } else { for (var i = 0; i < events.length; i++) { var temp = {}; temp.info = events[i].summary; temp.start = events[i].start.dateTime || events[i].start.date; googleEvents.push(temp); } } console.log(googleEvents); // it is work fine }); ... ... }))
//server/controller/todo.js
.... .... var event = { 'summary': 'Google I/O 2015', 'location': '800 Howard St., San Francisco, CA 94103', 'description': 'A chance to hear more about Google\'s developer products.', 'start': { 'dateTime': '2017-03-20T09:00:00-07:00', 'timeZone': 'America/Los_Angeles', }, 'end': { 'dateTime': '2017-03-23T17:00:00-07:00', 'timeZone': 'America/Los_Angeles', }, 'recurrence': [ 'RRULE:FREQ=DAILY;COUNT=2' ], 'reminders': { 'useDefault': false, 'overrides': [ { 'method': 'email', 'minutes': 24 * 60 }, { 'method': 'popup', 'minutes': 10 }, ], }, }; var calendar = google.calendar('v3'); calendar.events.insert({ //here ERROR 'TypeError: authClient.request is not a function' is generated auth: req.session.oauth2Client, calendarId: 'primary', resource: event, }, function(err, event) { if (err) { console.log('There was an error contacting the Calendar service: ' + err); return; } console.log('Event created: %s', event.htmlLink); }); ... ...
这不起作用,因为req.session
存储为json:
要存储或访问会话数据,只需使用请求属性req.session,它通常被商店序列化为JSON,所以嵌套的对象通常很好。 https://github.com/expressjs/session
当被存储为json时,所有的方法都从对象中剥离,只有数据被保存。
我已经通过创build一个包含所有oauth对象的独立全局对象来解决这个问题,可以通过session id来获取:
//Global object var auths = {}; //... //Save Client auths[req.session.id] = oauth2Client; //... //use client var calendar = google.calendar('v3'); calendar.events.insert({ auth: auths[req.session.id], calendarId: 'primary',
- 如何从passportjs中的刷新令牌获取新的Google oauth访问令牌
- 使用Google API的Firebase – 需要帐单和/或身份validation
- Google API NodeJS Library OAuth2请求
- 谷歌stream行时间在nodejs
- 使用一个stream,使用Node.js将video上传到Youtube
- Node.js:Google AnalyticsAPI:如何使用“服务帐户”进行授权的只读pipe理API请求?
- 使用Google API访问公共日历,无需用户login
- Firebase – NodeJS:用于Google API的OAuth2域范围委派
- Google API服务帐户和nodejs