Issue #3446💬 RespondidoAbierto el 9 de mayo de 2021por Spectrevuln-sketchReacciones 0

No se pueden almacenar datos Token inesperado '-'

Respuesta rápidapor Ju99ernaut

Los nombres de variables no pueden contener '-', por lo que esta sintaxis es inválida: '''js const { gjs-assets, gjs-components, gjs-css, gjs-html, gjs-styles } = req.body; ```

Lee la respuesta completa abajo ↓

Pregunta

Por favor, ayudadme, quiero almacenar datos de GJS en mysql pero no consigo obtener ningún dato de frontend a back end Aquí es mi código: 'const editor = grapesjs.init({ contenedor: "#editor", storageManager: { Tipo: 'A distancia', params: {}, // Para valores personalizados en peticiones tus endpoints SERVER urlStore: 'http://example.com/store-webpage', urlLoad: 'http://example.com/load-webpage', contentTypeJson: cierto, fijaPasos antes de guardar: 1, },

Fragmento de códigoTEXT
blockManager: {
    appendTo: "#blocks",
  },
  StyleManager: {
    appendTo: "#styles-contenedor",
    Sectores: [
      {
        nombre: "Dimension",
        abierto: falso,
        buildProps: ["ancho", "altura mínima", "acolchado"],
        Propiedades: [
          {
            tipo: "entero",
            nombre: "El ancho",
            propiedad: "ancho",
            Unidades: ["PX", "%"],
            Valores por defecto: "auto",
            min: 0,
          },
        ],
      },
    ],
  },
  layerManager: {
    appendTo: "#layers-contenedor",
  },
  traitManager: {
    appendTo: "#trait-contenedor",
  },
  selectorManager: {
    appendTo: "#styles-contenedor",
  },
  Paneles: {
    Valores por defecto: [
      {
        id: "acciones básicas",
        el: ".panel__basic-acciones",
        botones: [
          {
            id: "visibilidad",
            activo: true, // activo por defecto
            NombreClase: "btn-toggle-borders",
            etiqueta: '<i class="fa fa-clone"></i>',
            comando: "sw-visibility", // Comando incorporado
          },
        ],
      },
      {
        id: "store-data",
        el: ".panel__save-datos",
        botones: [
          {
            id: 'guardar-db',
            claseNombre: 'fa fa-flopy icon-flopy',
            etiqueta: '<i class="far fa-save"></i>',
            Comandamiento: 'guardar-db',
            atributos: { título: 'Guardar la base de datos' }
          },
        ],
      },
      {
        id: "panel-dispositivos",
        EL: ".panel__devices",
        botones: [
          {
            id: "dispositivo-escritorio",
            etiqueta: '<i class="fa fa-television"></i>',
            comando: "establecer-dispositivo-escritorio",
            ACTIVO: Cierto,
            Activable: falso,
          },
          {
            id: "dispositivo-móvil",
            etiqueta: '<i class="fa fa-mobile"></i>',
            comando: "establecer-dispositivo-móvil",
            Activable: falso,
          },
        ],
      },
    ],
  },
  deviceManager: {
    Dispositivos: [
      {
        nombre: "Escritorio",
        ancho: "",
      },
      {
        nombre: "Mobile",
        Ancho: "320px",
        widthMedia: "480px",
      },
    ],
  },
  Plugins: ["GJS-Blocks-Basic"],
  pluginsOpts: {
    "gjs-blocks-basic": {},
  },
});
Mandos
editor. Commands.add('save-db', {
  run: function (editor, sender) {
    sender & & sender.set('active', 0); Apaga el botón
    editor.store();
  }
});
editor.on('storage:load', function(e) { console.log('Load', e);});
editor.on('storage:store', function(e) { console.log('Stored ', e);});  

editor. Commands.add("set-device-desktop", {
  run: (editor) => editor.setDevice("Escritorio"),
});
editor. Commands.add("set-device-mobile", {
  run: (editor) => editor.setDevice("Mobile"),
});
`
Página web de la tienda de backend
'exports.storeWebpage = async (req, res)=>{
    const { gjs-assets, gjs-components, gjs-css, gjs-html, gjs-styles } = req.body;
    if (usuario){
      var gjs_content = new GjsModels({
          Activos:Activos,
          componentes:componentes,
          CSS:CSS,
          html:html,
          Estilos:Estilos
      })
      await gjs_content.save()
      .then(response=>{
          console.log('Guardado con éxito con ${respuesta}')
          res.redirect('/admin/story-maker');
        }).catch(err =>{
            console.log('Error guardado ${err.message}')
            res.redirect('/admin/story-maker');
      })
    }
}`

Respuestas (4)

Ju99ernaut10 de mayo de 2021

Los nombres de variables no pueden contener '-', por lo que esta sintaxis es inválida: '''js const { gjs-assets, gjs-components, gjs-css, gjs-html, gjs-styles } = req.body;

Spectrevuln-sketch11 de mayo de 2021

Por favor, ayudadme, quiero guardar la plantilla en MySQL. ¿Cómo lo hago?

Ju99ernaut11 de mayo de 2021

Desafortunadamente, esto puede estar fuera del alcance de Grapesjs, pero hay algunas cosas a tener en cuenta '''js Esto no es válido const { gjs-assets, gjs-components, gjs-css, gjs-html, gjs-styles } = req.body;

Puedes intentar asignar cada valor individualmente const { cuerpo } = requ; activos const = cuerpo['GJS-Assets']; const components = body['gjs-components']; //...


Además, como parece que estás quitando el prefijo 'gjs-' durante el almacenamiento, también debes añadirlo de nuevo durante la carga. Aquí se usa un enfoque similar https://github.com/Ju99ernaut/gjs-api pero para python y postgres.
ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @Spectrevuln-sketch.

El problema con No se puede almacenar token inesperado de datos '-' parece ser una condición de carrera o un problema de sincronización de gestión de estado. Esto suele ocurrir cuando los eventos del ciclo de vida de los componentes y las modificaciones del DOM se superponen, creando un estado inconsistente.

Qué probar:

  1. Añadir un envoltorio setTimeout para asegurar que el DOM se ha asentado: '''javascript setTimeout(() => { Tu operación aquí }, 0);

2. **Comprobar el orden de inicialización** — asegúrate de que los componentes estén completamente cargados antes de interactuar con ellos

3. **Utilizar el sistema de eventos del editor** — escuchar los eventos de finalización:
'''javascript
editor.on('component:mount', (component) => {
  Es seguro interactuar con el componente aquí
});

Recomendaciones de siguientes pasos:

  • Prueba con la última versión de GrapesJS si no lo has hecho
  • Proporcionar un ejemplo mínimo reproducible (CodeSandbox) — esto ayuda al equipo a identificar la causa raíz más rápido
  • Incluir errores de GrapesJS, de navegador y de consola en tu informe

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.