Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

166
Vistas
TypeError al acceder a window.google en Next.js

Estoy tratando de incorporar la función de inicio de sesión de Google en mi aplicación Next. Así es como lo he estado haciendo.

En _document.js

 import React from 'react'; import Document, {Html, Head, Main, NextScript } from 'next/document'; export default class MyDocument extends Document{ render(){ return( <Html lang="en"> <Head> <meta name="theme-color" /> {/* This should add `google` to `window` */} <script type="application/javascript" src="https://accounts.google.com/gsi/client" async /> </Head> <body> <Main /> <NextScript /> </body> </Html> ); } }

Y luego en pages/login.js

 import { React, useEffect, ... } from 'react' export default function LoginPage (props) { // When page is rendered, render the 'Sign-in with Google' button useEffect(() => { window.google.accounts.id.initialize({ client_id: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID, callback: res => { console.log(res) } }) window.google.accounts.id.renderButton( document.getElementById('googleSignIn'), { theme: 'filled_blue', size: 'large', text: 'continue_with' } ) }, []) return (<> {/* Provide an element for the button to render into */} <div id="googleSignIn" /> </>) }

Pero esto arroja un error:

login.js:48 Uncaught TypeError: Cannot read properties of undefined (reading 'accounts')

En otras palabras, window.google no está definido.

¿Qué tiene de malo esto?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

NextJS siempre procesa previamente las páginas en el servidor, en este caso window no está disponible. Siempre puede usar la biblioteca next/router . esperar hasta que la página cargue en el cliente

 import { React, useEffect, ... } from 'react' import { useRouter } from 'next/router' export default function LoginPage (props) { // When page is rendered, render the 'Sign-in with Google' button const router=useRouter() //create router state useEffect(() => { if(window){ //check window if exist on each effect execution window.google.accounts.id.initialize({ client_id: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID, callback: res => { console.log(res) } }) window.google.accounts.id.renderButton( document.getElementById('googleSignIn'), { theme: 'filled_blue', size: 'large', text: 'continue_with' } ) } }, [router]) // to run again when client router loads return (<> {/* Provide an element for the button to render into */} <div id="googleSignIn" /> </>) }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda