mulesoft - Error de Dataweave "Los tipos `Array` y `Number` no se pueden comparar

CorePress2024-01-24  5

Estoy aprendiendo Mulesoft 4 e intento ejecutar un filtro en una lista de libros. En el mensaje Transformar no hay errores y en la vista previa los libros se filtran por precio como se esperaba.

Cuando ejecuto la solicitud en mi cliente REST, aparece el siguiente error 500 Server Error. Cuando elimino el filtro, obtengo una publicación exitosa en REST. Establecí un punto de interrupción en el componente Transformar y recibí el siguiente error. ¿Cómo puedo solucionar este problema?

Carga útil de entrada de libros

Descripción detallada del error

INFO  2021-03-27 16:51:32,014 [[MuleRuntime].uber.05: [data-weave-1].data-weave-1Flow.CPU_LITE @6c4cd988] [processor: data-weave-1Flow/processors/0; event: 979d4040-8f46-11eb-8c87-6817296a6b20] org.mule.runtime.core.internal.processor.LoggerMessageProcessor: Start upload
ERROR 2021-03-27 16:54:05,959 [[MuleRuntime].uber.04: [data-weave-1].data-weave-1Flow.CPU_INTENSIVE @744a745c] [processor: ; event: 979d4040-8f46-11eb-8c87-6817296a6b20] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler: 
********************************************************************************
Message               : "Types `Array` and `Number` can not be compared.

6|  book: payload.catalog.*book filter($.price < 10) map ((data, index) -> 
                                       ^^^^^^^
Trace:
  at main (line: 6, column: 37)" evaluating expression: "%dw 2.0
output application/json
---
catalog:
{
    book: payload.catalog.*book filter($.price < 10) map ((data, index) -> 
    {
        autor: data.author,
        title: data.title,
        genre: data.genre,
        price: data.price
    })
}".
Element               : data-weave-1Flow/processors/1 @ data-weave-1:data-weave-1.xml:15 (Transform Message)
Element DSL           : <ee:transform doc:name="Transform Message" doc:id="f3e0bf40-cf5f-421b-a895-b75fbd5ff58e">
<ee:message>
<ee:set-payload>%dw 2.0
output application/json
---
catalog:
{
    book: payload.catalog.*book filter($.price < 10) map ((data, index) -> 
    {
        autor: data.author,
        title: data.title,
        genre: data.genre,
        price: data.price
    })
}</ee:set-payload>
</ee:message>
</ee:transform>
Error type            : MULE:EXPRESSION
FlowStack             : at data-weave-1Flow(data-weave-1Flow/processors/1 @ data-weave-1:data-weave-1.xml:15 (Transform Message))

  (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

Código de entrada

{
  "catalog": {
    "book": [
      {
        "autor": "Knorr, Stefan",
        "title": "Creepy Crawlies",
        "genre": "Horror",
        "price": "4.95"
      },
      {
        "autor": "Randall, Cynthia",
        "title": "Lover Birds",
        "genre": "Romance",
        "price": "4.95"
      },
      {
        "autor": "O'Brien, Tim",
        "title": "MSXML3: A Comprehensive Guide",
        "genre": "Computer",
        "price": "36.95"
      },
      {
        "autor": "Corets, Eva",
        "title": "Maeve Ascendant",
        "genre": "Fantasy",
        "price": "5.95"
      },
      {
        "autor": "O'Brien, Tim",
        "title": "Microsoft .NET: The Programming Bible",
        "genre": "Computer",
        "price": "36.95"
      },
      {
        "autor": "Ralls, Kim",
        "title": "Midnight Rain",
        "genre": "Fantasy",
        "price": "5.95"
      },
      {
        "autor": "Corets, Eva",
        "title": "Oberon's Legacy",
        "genre": "Fantasy",
        "price": "5.95"
      },
      {
        "autor": "Kress, Peter",
        "title": "Paradox Lost",
        "genre": "Science Fiction",
        "price": "6.95"
      },
      {
        "autor": "Thurman, Paula",
        "title": "Splish Splash",
        "genre": "Romance",
        "price": "4.95"
      },
      {
        "autor": "Corets, Eva",
        "title": "The Sundered Grail",
        "genre": "Fantasy",
        "price": "5.95"
      },
      {
        "autor": "Galos, Mike",
        "title": "Visual Studio 7: A Comprehensive Guide",
        "genre": "Computer",
        "price": "49.95"
      },
      {
        "autor": "Gambardella, Matthew",
        "title": "XML Developer's Guide",
        "genre": "Computer",
        "price": "44.95"
      }
    ]
  }
}

¿Podrías p?¿El arrendamiento proporciona un ejemplo de carga útil de entrada? Gracias.

-olamiral

27/03/2021 a las 11:01

Supongo que o no estás obteniendo una matriz plana, por lo que $.price devuelve una matriz, o estás obteniendo una estructura de datos donde $.price en realidad es solo una matriz. Aunque la vista previa es correcta, la vista previa utiliza metadatos, no la salida real. Coloque un punto de interrupción y depure, luego use la ventana de evaluación de tejido de datos para simplemente hacer payload.catalog.*book y ver cómo se ve la estructura.

-Michael Jones

27/03/2021 a las 13:52

Por favor, publique también la información completa del error. Muchas veces incluye información sobre los datos infractores y otros conocimientos.

-aled

27/03/2021 a las 14:07

@aled vea el mensaje de error detallado arriba. Michael, funciona sin el filtro. Olamiral vea el enlace de carga útil arriba.

- Adrianne Geyer

27/03/2021 a las 22:33

Eso no es una carga útil. Esa es la estructura de los metadatos. Agregue la entrada real que causa el error, en texto, no en una captura de pantalla.

-aled

28 de marzo de 2021 a las 1:08



------------------------------------

Esto debería ayudarle a obtener el resultado esperado. El precio en la entrada es una cadena (ya que está dentro de "") y, por lo tanto, la comparación en el filtro lo convierte en un Número antes de compararlo con ellímite (10).

%dw 2.0
output application/json
---
catalog:
{
    book: (payload.catalog.*book map {
                 temp: $ filter ($.price as Number < 10) map {
                     author:$.autor,
                     title: $.title,
                     genre: $.genre,
                     price: $.price
                 }
                  
    }.temp)[0]
}



------------------------------------

Actualizando la respuesta con la captura de pantalla de Studio:

Script dentro de una aplicación Mule en Studio:

Resultado de la ejecución del script DW, para la carga útil mencionada en la sección Entrada asumida

================================================ =================

Supongo que su carga útil de entrada se parece a la siguiente, ya que si dejo el filtro afuera puedo reproducir el error que obtiene, atribuyéndolo al tipo de datos del libro [].

Entrada supuesta:

{

    "catalog": [{
            "a1": "a2",
            "book": [{
                "author": "bac",
                "title": "def",
                "genre": "abc",
                "price": 15
            }, {
                "author": "bac1",
                "title": "def2",
                "genre": "abc3",
                "price": 9
            }, {
                "author": "bac21",
                "title": "def22",
                "genre": "abc23",
                "price": 8
            }]

        },
        {
            "a1": "b2",
            "book": [{
                "author": "abac",
                "title": "adef",
                "genre": "aabc",
                "price": 165
            }, {
                "author": "baac1",
                "title": "daef2",
                "genre": "aabc3",
                "price": 19
            }, {
                "author": "b4ac21",
                "title": "d4ef22",
                "genre": "a4bc23",
                "price": 7
            }]

        }
    ]
}

Guión de trabajo:

%dw 2.0
output application/json
---
catalog:
{
    book: flatten(payload.catalog.*book map {
            temp: $ filter ($.price < 10) map {
                autor: $.author,
                title: $.title,
                genre: $.genre,
                price: $.price
            }
    }.temp)
}

Salida:

{
  "catalog": {
    "book": [
      {
        "autor": "bac1",
        "title": "def2",
        "genre": "abc3",
        "price": 9
      },
      {
        "autor": "bac21",
        "title": "def22",
        "genre": "abc23",
        "price": 8
      },
      {
        "autor": "b4ac21",
        "title": "d4ef22",
        "genre": "a4bc23",
        "price": 7
      }
    ]
  }
}

Script con salida de error

7

temp: $ filter ($.price < 10) map { Esta línea arroja un error con un garabato rojo debajo del signo de dólar que dice: Esperando tipo: Array<T>, pero obtuve: {-|autor: "Gambarde...descripción: Cadena|-}. |-- De: Matriz<T> |---- De: filtro(elementos: Matriz<T>, criterios: (elemento: T, índice: Número) -> booleano) -> Matriz<T>

- Adrianne Geyer

27/03/2021 a las 21:40

>p>

¿Puedes pegar una carga útil de muestra? ¿Es solo un libro el que tienes en el catálogo?

- Salim Khan

28 de marzo de 2021 a las 0:23

Si lo que estás intentando transformar es una lista de libros, ejecuté el script que mencioné anteriormente en Anypoint Studio. Adjuntando la captura de pantalla para su referencia. Puedes ignorar esa indicación de error y estudio y deberíasIntento ejecutar el script para ver si funciona. ¡¡Buena suerte con el aprendizaje y todo lo que viene!!

- Salim Khan

28 de marzo de 2021 a las 0:43

Además, existe un área de juegos para ejecutar scripts DW fuera de Anypoint Studio. Puede intentar ejecutar los scripts allí, solo para confirmar la lógica y también ayuda a aprender DataWeave. Está ubicado en. --> dwlang.fun

- Salim Khan

28 de marzo de 2021 a las 0:48

Editando mi comentario anterior: puedes ignorar la indicación de error en Studio y deberías intentar ejecutar el script (ejecutar la aplicación Mule) para ver si funciona

- Salim Khan

28 de marzo de 2021 a las 6:22

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare