Невозможно прочитать свойство «установлен» из неопределенного express js - PullRequest
0 голосов
/ 19 марта 2020

Мне не удалось найти пример этой проблемы с 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()
});

1 Ответ

0 голосов
/ 19 марта 2020

Я забыл передать кредиты моему авторизованному вызову в моем вызове updateSheets ()


async function updateSheet () {
  const authClient = await authorize(creds); //PASS CREDS HERE
  const request = {
    spreadsheetId: '1VTiTgPvMvLlOVBhBfoMGrshfMMJJMMzoA6GesheWMPg', 
    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;
    // TODO: Change code below to process the `response` object:
    console.log(JSON.stringify(response, null, 2));
  } catch (err) {
    console.error(err);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...