Метод: spreadsheets.values.append TypeError: Преобразование круговой структуры в JSON - PullRequest
0 голосов
/ 30 октября 2018

Я успешно использую API Google Sheets. Мне удалось использовать методы spreadsheets.values.update и spreadsheets.values.get без ошибок. Сегодня я пытаюсь использовать метод: spreadsheets.values.append. Этот метод просто добавляет строку данных в конец таблицы. На портале для разработчиков вы можете "попробовать этот API", и когда я это сделаю, я получу ответ 200.

Однако, когда я запускаю точно такой же метод (включая параметры!) В моем приложении NodeJS / Express, я получаю ошибку:

«Ошибка типа: преобразование круговой структуры в JSON»,

Тем не менее, когда я смотрю на Google Sheet, данные успешно добавлены. Вот как выглядит мой код:

function postValid(req, res) {
    const data = req.body;
    console.log('received validate post');
    sheets.spreadsheets.values.append(  {
        auth: jwtClient,
        spreadsheetId: ssId,
        range: 'Valid!A:C',
        resource: {
            values: [
                [1, 2, 3]
            ]
        },
        valueInputOption: 'USER_ENTERED',
    }, (err, response) => {
        if (err) {
            res.status(500);
            res.send('The API returned an error: ' + err);
        }
        res.send(response)
    })
}

Я мог бы игнорировать ошибку, так как данные отправляются, но я действительно хотел бы знать, что вызывает эту ошибку круговой структуры. Как я могу пойти на отладку этого?

Как я уже говорил, методы get и update с почти одинаковой структурой работают нормально, поэтому это не части {auth: jwtClient, spreadsheetId: ssId, }, а остальные - довольно стандартный JSON. Я просто не понимаю.

Кто-нибудь сталкивался с такой же проблемой?

UPDATE: Я сузил вопрос. Если я отключу анализатор тела JSON в Express, то смогу просмотреть полный ответ. Здесь ниже вы увидите, что циклическая ссылка является частью запроса, но этот запрос выполняется с помощью методов googleapi , это возможная ошибка с библиотекой googleapi ?

{ status: 200,
  statusText: 'OK',
  headers:
   { 'content-type': 'application/json; charset=UTF-8',
     vary: 'X-Origin, Referer, Origin,Accept-Encoding',
     date: 'Tue, 30 Oct 2018 12:22:09 GMT',
     server: 'ESF',
     'cache-control': 'private',
     'x-xss-protection': '1; mode=block',
     'x-frame-options': 'SAMEORIGIN',
     'alt-svc': 'quic=":443"; ma=2592000; v="44,43,39,35"',
     'accept-ranges': 'none',
     connection: 'close' },
  config:
   { adapter: [Function: httpAdapter],
     transformRequest: { '0': [Function: transformRequest] },
     transformResponse: { '0': [Function: transformResponse] },
     timeout: 0,
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: 2147483648,
     validateStatus: [Function],
     headers:
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'application/json;charset=utf-8',
        Authorization:
        <REMOVED>,
        'User-Agent': 'google-api-nodejs-client/1.6.1',
        'Content-Length': 29 },
     method: 'post',
     url:
      'https://sheets.googleapis.com/v4/spreadsheets/<REMOVED>/values/Valid!A:C:append',
     paramsSerializer: [Function],
     data: '{"values":[[null,null,null]]}',
     params: { valueInputOption: 'USER_ENTERED' } },
  request:
   ClientRequest {
     _events:
      { socket: [Function],
        abort: [Function],
        aborted: [Function],
        error: [Function],
        timeout: [Function],
        prefinish: [Function: requestOnPrefinish] },
     _eventsCount: 6,
     _maxListeners: undefined,
     output: [],
     outputEncodings: [],
     outputCallbacks: [],
     outputSize: 0,
     writable: true,
     _last: true,
     chunkedEncoding: false,
     shouldKeepAlive: false,
     useChunkedEncodingByDefault: true,
     sendDate: false,
     _removedConnection: false,
     _removedContLen: false,
     _removedTE: false,
     _contentLength: null,
     _hasBody: true,
     _trailer: '',
     finished: true,
     _headerSent: true,
     socket:
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'sheets.googleapis.com',
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 8,
        connecting: false,
        _hadError: false,
        _handle: null,
        _parent: null,
        _host: 'sheets.googleapis.com',
        _readableState: [ReadableState],
        readable: false,
        _maxListeners: undefined,
        _writableState: [WritableState],
        writable: false,
        allowHalfOpen: false,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: null,
        _requestCert: true,
        _rejectUnauthorized: true,
        parser: null,
        _httpMessage: [Circular],   //<--HERE IS ONE ISSUE
        write: [Function: writeAfterFIN],
        [Symbol(res)]: [TLSWrap],
        [Symbol(asyncId)]: 78,
        [Symbol(lastWriteQueueSize)]: 0,
        [Symbol(timeout)]: null,
        [Symbol(kBytesRead)]: 575,
        [Symbol(kBytesWritten)]: 517,
        [Symbol(connect-options)]: [Object] },
     connection:
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'sheets.googleapis.com',
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 8,
        connecting: false,
        _hadError: false,
        _handle: null,
        _parent: null,
        _host: 'sheets.googleapis.com',
        _readableState: [ReadableState],
        readable: false,
        _maxListeners: undefined,
        _writableState: [WritableState],
        writable: false,
        allowHalfOpen: false,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: null,
        _requestCert: true,
        _rejectUnauthorized: true,
        parser: null,
        _httpMessage: [Circular],  //<--Again another problem
        write: [Function: writeAfterFIN],
        [Symbol(res)]: [TLSWrap],
        [Symbol(asyncId)]: 78,
        [Symbol(lastWriteQueueSize)]: 0,
        [Symbol(timeout)]: null,
        [Symbol(kBytesRead)]: 575,
        [Symbol(kBytesWritten)]: 517,
        [Symbol(connect-options)]: [Object] },
     _header:
      'POST /v4/spreadsheets/<REMOVED>/values/Valid!A:C:append?valueInputOption=USER_ENTERED HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: application/json;charset=utf-8\r\nAuthorization: <REMOVED> User-Agent: google-api-nodejs-client/1.6.1\r\nContent-Length: 29\r\nHost: sheets.googleapis.com\r\nConnection: close\r\n\r\n',
     _onPendingData: [Function: noopPendingOutput],
     agent:
      Agent {
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 443,
        protocol: 'https:',
        options: [Object],
        requests: {},
        sockets: [Object],
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: false,
        maxSockets: Infinity,
        maxFreeSockets: 256,
        maxCachedSessions: 100,
        _sessionCache: [Object] },
     socketPath: undefined,
     timeout: undefined,
     method: 'POST',
     path:
      '/v4/spreadsheets/<REMOVED>/values/Valid!A:C:append?valueInputOption=USER_ENTERED',
     _ended: true,
     res:
      IncomingMessage {
        _readableState: [ReadableState],
        readable: false,
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        socket: [TLSSocket],
        connection: [TLSSocket],
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        httpVersion: '1.1',
        complete: true,
        headers: [Object],
        rawHeaders: [Array],
        trailers: {},
        rawTrailers: [],
        aborted: false,
        upgrade: false,
        url: '',
        method: null,
        statusCode: 200,
        statusMessage: 'OK',
        client: [TLSSocket],
        _consuming: true,
        _dumped: false,
        req: [Circular],  //<--Again another circular reference
        responseUrl:
         'https://sheets.googleapis.com/v4/spreadsheets/<REMOVED>/values/Valid!A:C:append?valueInputOption=USER_ENTERED',
        redirects: [] },
     aborted: undefined,
     timeoutCb: null,
     upgradeOrConnect: false,
     parser: null,
     maxHeadersCount: null,
     _redirectable:
      Writable {
        _writableState: [WritableState],
        writable: true,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _options: [Object],
        _redirectCount: 0,
        _redirects: [],
        _requestBodyLength: 29,
        _requestBodyBuffers: [],
        _onNativeResponse: [Function],
        _currentRequest: [Circular],  //<-- Again!!
        _currentUrl:
         'https://sheets.googleapis.com/v4/spreadsheets/<REMOVED>/values/Valid!A:C:append?valueInputOption=USER_ENTERED' },
     [Symbol(isCorked)]: false,
     [Symbol(outHeadersKey)]:
      { accept: [Array],
        'content-type': [Array],
        authorization: [Array],
        'user-agent': [Array],
        'content-length': [Array],
        host: [Array] } },
  data:
   { spreadsheetId: <REMOVED>,
     tableRange: 'Valid!A1:C8',
     updates:
      { spreadsheetId: <REMOVED>,
        updatedRange: 'Valid!A9' } } }

1 Ответ

0 голосов
/ 28 декабря 2018

Это действительно ответ Google API. Я также видел это при вызове других API, таких как https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query Вы должны обязательно вызывать только соответствующую часть ответа и не пытаться преобразовать ее в JSON, чтобы избежать циклических сообщений об ошибках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...