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',