Наличие 2-х клиентов авторизации приводит к 404 при создании события календаря - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь создать 2 календарных события для 2 календарей с помощью клиентской библиотеки API Google Node.js в одной функции.Я использую 2 отдельных объекта аутентификации, которые я получаю следующим образом:

var auth1 = await google.auth.getClient({ credentials: config.account1Creds, scopes: ["https://www.googleapis.com/auth/calendar.events"] }); 
var auth2 = await google.auth.getClient({ credentials: config.account2Creds, scopes: ["https://www.googleapis.com/auth/calendar.events"] });

Я могу создать событие в первом точном календаре, но когда я создаю событие во втором календаре, я получаю404 Не найдено обратно с сервера API Календаря Google.

Если я закомментирую первую строку var auth1 = await google.auth... и создаю событие только во 2-м календаре, все в порядке, и событие создается успешно.

Это выглядит так, как будто первый раз getClient вызывается, он устанавливает глобальный объект аутентификации, который используется для всех оставшихся запросов API, и его нельзя заменить, но это всего лишь догадка, которую я имею, и я нена самом деле знаю.

У кого-нибудь есть идеи, почему это происходит?

РЕДАКТИРОВАТЬ:

GetGoogleCalendarService: async function(credentials)
{
    var auth = await google.auth.getClient({ credentials: credentials, scopes: ["https://www.googleapis.com/auth/calendar.events"] });

    return google.calendar({ version: "v3", auth: auth });
},

InsertCalendarEvent: function(calendar, entry, callback)
{
    calendar.events.insert(entry, callback);
},

SendInvitesToEvent: async function (request, response)
{
    //build the calendar event
    var entry = {
        ...
    }

    //insert into operations calendar
    var opsCal = await Events.GetGoogleCalendarService(config.GetConfig().OpsCalendarCredentials);
    Events.InsertCalendarEvent(mainCal, entry);

    //insert into public calendar
    var publicCal = await Events.GetGoogleCalendarService(config.GetConfig().PublicCalendarCredentials);

    Events.InsertCalendarEvent(publicCal, entry, async function(err, event) 
    {
        //err: 404 Not Found
        ...
    }

}

1 Ответ

0 голосов
/ 17 апреля 2019
  • Вы хотите вставить события в 2 календаря, используя 2 клиента.
    • Клиент «A» вставляет событие в календарь «A».
    • Клиент «B» вставляет событие в календарь «B».
  • Вы используете googleapis из Node.js.

Если мое понимание верно, как насчет этой модификации?В этой модификации я разделил получение auth по каждому удостоверению.

Модифицированный скрипт:

const { google } = require("googleapis");

function insertEvent(calendar, calendarId) {
    // insert event
}

async function getService(c) {
  var auth = await google.auth.getClient({
    credentials: c,
    scopes: ["https://www.googleapis.com/auth/calendar.events"]
  });
  return google.calendar({ version: "v3", auth: auth });
}

function main() {
  getService(config.account1Creds).then(calendar => {
    insertEvent(calendar, "### calendarId ###");
  });
  getService(config.account2Creds).then(calendar => {
    insertEvent(calendar, "### calendarId ###");
  });
}

main();

Примечание:

  • Это пример скрипта.Поэтому, пожалуйста, измените это для вашей ситуации.

В моем окружении я могу подтвердить, что этот скрипт работает.Но если это не сработало и эта модификация не принесла желаемого результата, я приношу свои извинения.

Редактировать:

Из вашего текущего сценария я изменил следующим образом.

  • Является ли opsCal mainCal?В моей модификации opsCal используется как mainCal.

Модифицированный скрипт:

От:
//insert into operations calendar
var opsCal = await Events.GetGoogleCalendarService(config.GetConfig().OpsCalendarCredentials);
Events.InsertCalendarEvent(mainCal, entry);

//insert into public calendar
var publicCal = await Events.GetGoogleCalendarService(config.GetConfig().PublicCalendarCredentials);

Events.InsertCalendarEvent(publicCal, entry, async function(err, event) 
{
    //err: 404 Not Found
    ...
}
До:
Events.GetGoogleCalendarService(config.GetConfig().OpsCalendarCredentials).then(
  opsCal => {
    Events.InsertCalendarEvent(opsCal, entry);
  }
);
Events.GetGoogleCalendarService(config.GetConfig().PublicCalendarCredentials).then(
  publicCal => {
    Events.InsertCalendarEvent(publicCal, entry);
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...