#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: (Спасибо за попытку, я ценю это! Я решил просто добавить второй календарь в качестве участника в приглашение, а затем просто добавить его в один календарь, это не тот подход, который мы хотели, но пока сойдет. Спасибо за помощь!