1

私はgoogleapisgoogle authをGoogleカレンダーに使用しています。私はcalendar eventリストを取得しているが、私は、それは誤りすなわちスローイベントを挿入しようとすると、ここでTypeError: authClient.request is not a function in nodejs.googleapis TypeError:authClient.requestはnodejsの関数ではありません

は私のコードスニペットです: -

//route.js //サーバー

... 
app.get('/auth/google', passport.authenticate('google', { 
     scope: ['profile', 'email', 'https://www.googleapis.com/auth/calendar'] 
    })); 
... 

/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); 
}); 

... 
... 
+0

あなたはこの[スレッド]で参照することができる(http://stackoverflow.com/questions/39621428)。たぶん、問題は 'oauth_client'にあります。この[ドキュメント](https://github.com/google/google-auth-library-nodejs)に沿って、設定で何かを逃したかどうかを確認することもできます。 API呼び出しを行う前に、呼び出すAPIが有効になっていることを確認する必要があります。 [Google Developers Console](https://console.developer.google.com/)の「APIs&Auth」>「APIs」にアクセスして、呼び出したいAPIを有効にします。以下の例では、DNS APIを有効にする必要があります。 – abielita

答えて

1

req.sessionをJSONとして格納されるので、これは動作しない。JSONとして格納され、すべてのメソッドは、物体側から剥離されたデータのみが保存されると

To store or access session data, simply use the request property req.session, which is (generally) serialized as JSON by the store, so nested objects are typically fine. https://github.com/expressjs/session

IセッションIDによって、回収すべてのOAuthオブジェクトを含む別々のグローバルオブジェクトを作成することによってそれを解決した

//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', 
関連する問題