Наличие 2 аутентификационных клиентов приводит к 404 при создании события календаря

#node.js #google-api #google-api-nodejs-client

#node.js #google-api #google-api-nodejs-client

Вопрос:

Я пытаюсь создать 2 события календаря в 2 календарях с помощью Google Node.js Клиентская библиотека API в одной функции. Я использую 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"] });
 

Я могу создать событие в первом календаре нормально, но когда я создаю событие во 2-м календаре, я получаю 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:

  • Вы хотите вставить события в 2 календаря, используя 2 клиента.
    • Клиент «A» вставляет событие в календарь «A».
    • Клиент «B» вставляет событие в календарь «B».
  • Вы используете googleap из 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);
  }
);
 

Комментарии:

1. Нет, я пробовал это, но это не работает. Все еще получаю 404

2. @user1435899 Спасибо за ответ. Приношу свои извинения за доставленные неудобства. Можете ли вы предоставить весь свой сценарий для воспроизведения вашей проблемы? Конечно, пожалуйста, удалите вашу личную информацию. Я хотел бы это подтвердить. Если вы можете это сделать, пожалуйста, добавьте это в свой вопрос.

3. Круто, я обновил свой вопрос, включив в него код, который я сейчас использую.

4. @user1435899 Спасибо за обновление. Хотя я не уверен, тот ли это результат, который вы хотите, я предложил точку модификации в разделе Редактирования в моем ответе. Не могли бы вы подтвердить это? В моей среде я мог бы подтвердить, что этот сценарий работает. Но если это не сработало, и это изменение не было тем результатом, который вы хотите, я прошу прощения.

5. К сожалению, я все еще получаю 404: (Спасибо за попытку, я ценю это! Я решил просто добавить второй календарь в качестве участника в приглашение, а затем просто добавить его в один календарь, это не тот подход, который мы хотели, но пока сойдет. Спасибо за помощь!