Tengo una aplicación React que se ejecuta en Electron. A lo largo de todo el código del proceso del renderizador, he estado usando axios de la siguiente manera:
import React from 'react'; import axios from 'axios'; import { useQuery } from 'react-query'; ... const { data: queryResponse, isLoading } = useQuery( [query, getParameters], () => { const url = new URL(`https://www.devel.server/${query}`); url.search = new URLSearchParams(getParameters); return axios.get(url); } );Ahora traté de ejecutar el mismo código en el proceso principal y, de repente, recibo excepciones:
const { app, BrowserWindow, Menu, ipcMain } = require('electron'); const { odtParse } = require('./main/odt-parser.js'); const shell = require('electron').shell; const path = require('path'); import axios from 'axios'; ipcMain.on('generate-employee-contract', (event, employeeId) => { const url = new URL('https://www.devel.server/employee-contract-summary'); url.search = new URLSearchParams({ employeeId }); axios.get(url).then(function (response) { const filename = odtParse('./assets/Contract.odt', response.variables, response.conditions); shell.openPath(path.join(__dirname, filename)); }) }); Este es el error que recibo de la llamada axios.get() :
UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: el argumento "url" debe ser de tipo cadena. Recibió una instancia de URL
¿Que esta pasando? ¿Por qué el mismo código funciona en un proceso pero no en el otro? ¿Está usando diferentes instancias de axios de alguna manera?
EDITAR: según lo solicitado, la salida de console.log(url) :
URL { href: 'https://www.devel.server/employee-contract-summary?employeeId=377', origin: 'https://www.devel.server', protocol: 'https:', username: '', password: '', host: 'www.devel.server', hostname: 'www.devel.server', port: '', pathname: '/employee-contract-summary', search: '?employeeId=377', searchParams: URLSearchParams { 'employeeId' => '377' }, hash: '' }Hay una diferencia entre la implementación de URL en entornos Chromium ( utilizados por los procesos de representación ) y Node ( utilizados por el proceso principal ). En particular, la clase de URL compatible con WHATWG es global (y siempre está disponible) en los navegadores compatibles, pero estuvo disponible globalmente solo desde Node 10.x; antes de eso, solo se tenía que acceder a través require('url').URL import.
Parece que esta diferencia no funciona bien con las comprobaciones de tipo axios en su parámetro de url , lo que provoca el error ERR_INVALID_ARG_TYPE . Una forma de evitarlo es evitar pasar la URL por completo, transformándola en una cadena:
const url = new URL('https://www.devel.server/employee-contract-summary'); url.search = new URLSearchParams({ employeeId }); const urlString = url.toString(); // supported by URL class axios.get(urlString).then(/* ... */)Otro enfoque que vale la pena verificar es asegurarse de que el código en el proceso principal proporcione a axios el adaptador correcto, lo que también podría eliminar el problema (ya que el adaptador debería ser responsable de cerrar brechas como esta).