Мне не удалось найти пример этой проблемы с Express js или с API-интерфейсом Google Sheets. Я запускаю приложение express, которое получает запрос POST. Затем я передаю его в функцию, которая использует oAuth2, затем отправляет данные в виде добавленной строки на лист google
, когда я вызываю updateSheet (). следующая ошибка
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'installed' of undefined
at resolve (C:\Users\luther\Desktop\Pantree\index.js:50:69)
at new Promise (<anonymous>)
at authorize (C:\Users\luther\Desktop\Pantree\index.js:49:10)
at updateSheet (C:\Users\luther\Desktop\Pantree\index.js:91:28)
at app.post (C:\Users\luther\Desktop\Pantree\index.js:161:5)
at Layer.handle [as handle_request] (C:\Users\luther\Desktop\Pantree\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\luther\Desktop\Pantree\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\luther\Desktop\Pantree\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\luther\Desktop\Pantree\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\luther\Desktop\Pantree\node_modules\express\lib\router\index.js:281:22
Я не знаю, почему эта ошибка возникает при публикации, потому что ошибка вызывается в моем вызове authorize (), который прекрасно работает при получении исходных данных с листа.
Я обновил область действия API листов Google, чтобы разрешить чтение и запись, как показано ниже. Я использую фиктивные данные в своем объекте ресурса, чтобы исключить проблему, связанную с парсером тела, поэтому в настоящее время все, что я делаю из моего почтового запроса, - это вызов updateSheet () без аргументов
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
const TOKEN_PATH = 'token.json';
// Load client secrets from a local file.
fs.readFile('client_secret.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Google Sheets API.
authorize(JSON.parse(content), grabSheetData);
});
/**
* Create an OAuth2 client with the given credentials, and then execute the
* given callback function.
* @param {Object} credentials The authorization client credentials.
* @param {function} callback The callback to call with the authorized client.
*/
function authorize(credentials) {
return new Promise(resolve => { // Added
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getNewToken(oAuth2Client, e => resolve(e));
oAuth2Client.setCredentials(JSON.parse(token));
resolve(oAuth2Client);
});
});
}
/* GET SHEET DATA */
async function grabSheetData () {
var data = {
payload: ''
}
const authClient = await authorize(creds);
const request = {
spreadsheetId: 'xxxxxxxxxxxxxxxxxxxx',
range: 'A1:C',
valueRenderOption: "FORMATTED_VALUE",
dateTimeRenderOption: "SERIAL_NUMBER",
auth: authClient,
}
try {
const response = (await sheets.spreadsheets.values.get(request)).data;
console.log(JSON.stringify(response, null, 2));
data.payload=response
} catch (err) {
console.error(err);
}
return data
};
/* WRITE TO SHEET */
async function updateSheet () {
const authClient = await authorize();
const request = {
spreadsheetId: 'xxxxxxxxxxxxxxxx',
range: 'A7:C7',
valueInputOption: 'RAW',
insertDataOption: 'INSERT_ROWS',
resource: {
item: 'dummyname',
dateLogged:'dummydate',
expires:'dummy expire'
},
auth: authClient,
};
try {
const response = (await sheets.spreadsheets.values.append(request)).data;
console.log(JSON.stringify(response, null, 2));
} catch (err) {
console.error(err);
}
}
my app.post
app.post('/api/updateSheet', (req,res)=>{
updateSheet()
});