No such export X in resource Y: cómo solucionarlo en FiveM
¿Recibiendo 'No such export X in resource Y' en FiveM? Las causas: recurso no iniciado, nombre de carpeta incorrecto, desajuste de lado cliente o servidor, exportación renombrada y orden de inicio.
La consola muestra esto, a menudo en un bucle:
SCRIPT ERROR: @my_script/server/main.lua:14: No such export GetItemCount in resource my_inventoryTu script llamó a exports['my_inventory']:GetItemCount(). En ese momento, my_inventory no tenía una exportación con ese nombre. El mensaje nombra ambas partes, así que la solución es una de un pequeño número de causas. Esta guía cubre el caso genérico. Si la exportación es getSharedObject de es_extended, lee No such export getSharedObject in resource es_extended en su lugar, que tiene las causas específicas de ESX.
1. El recurso no se ha iniciado
Una exportación solo existe mientras su recurso se está ejecutando. Verifica la consola al inicio:
- ¿Está el recurso listado en
server.cfgconensureostart? - ¿Se inició sin errores, o imprimió
Couldn't start resourceoFailed to load script? - ¿Está detenido en txAdmin? Comprueba la página de Recursos.
Un recurso que no se pudo iniciar, por ejemplo debido a un error de sintaxis de Lua o una dependencia faltante, no tiene exportaciones. Soluciona su propio error primero. Véase Couldn't start resource y could not find dependency. Un error de sintaxis en particular está cubierto en Lua syntax error: unexpected symbol near.
2. El nombre del recurso es incorrecto
exports['my_inventory'] usa el nombre de la carpeta del recurso, no el título del script. Si la carpeta fue renombrada, cada script que la llama por el nombre antiguo falla.
Situaciones típicas:
- Renombraste
my_inventory-masteromy_inventory-maina algo más corto y seguiste llamando al nombre antiguo. - El nombre usa un guion en un lugar y un guion bajo en otro:
my-inventoryymy_inventoryson recursos diferentes. - La capitalización difiere: coincide exactamente con la carpeta.
- El recurso se encuentra en una carpeta con corchetes como
[qb]. Los corchetes son solo una categoría: no son parte del nombre, así que usamy_inventory, no[qb]/my_inventory.
Algunos recursos reemplazan otro con provide 'other_name' en su fxmanifest, para que los scripts que solicitan el nombre antiguo sigan funcionando. Si reemplazaste un recurso con uno compatible y el nombre antiguo falla, comprueba si el nuevo lo proporciona, y que eliminaste la carpeta antigua para que las dos no choquen.
3. La exportación está en el otro lado
Las exportaciones son por lado. Una exportación registrada en un script de cliente solo puede ser llamada desde otro script de cliente, y una registrada en el servidor solo desde un script de servidor.
-- my_inventory/server/main.lua
exports('GetItemCount', function(source, item)
return 0
end)-- my_script/client/main.lua
-- fails: GetItemCount exists on the server only
local count = exports['my_inventory']:GetItemCount('water')Para verificar, mira en los archivos del proveedor: la línea exports(...) está en client/ o server/, o en un archivo listado bajo shared_scripts, que se ejecuta en ambos lados. Si la exportación es solo de servidor, llámala desde un script de servidor, y obtén los datos al cliente con un evento o devolución de llamada, véase server callbacks.
4. La exportación fue renombrada o eliminada
Los recursos cambian entre versiones. Una exportación llamada GetItemCount en una versión anterior puede ser getItemCount o Search en una más nueva, y los nombres de Lua distinguen mayúsculas de minúsculas. Si el error apareció después de una actualización de cualquiera de los recursos:
- Abre el
fxmanifest.lua,READMEo documentación del proveedor y busca la lista de exportaciones actual. - Busca en la carpeta del recurso
exports(y el nombre que llamas. - Actualiza tu llamada, o actualiza el otro recurso a la versión para la que fue escrito el script.
Recuerda que lo inverso también existe: un script actualizado para llamar a una nueva exportación, mientras que el proveedor aún ejecuta una versión antigua sin ella.
grep -rn "exports(" resources/[mic]/my_inventoryEn Windows, usa el cuadro de búsqueda de tu editor en su lugar.
5. Orden de inicio y dependencias
Si el recurso existe y tiene la exportación, pero la llamada ocurre antes de que esté lista, obtienes el mismo error. Los recursos se inician en el orden de server.cfg:
ensure oxmysql
ensure ox_lib
ensure my_inventory
ensure my_scriptPon el proveedor por encima del script que lo usa. Para una solución permanente, establece el vínculo en el fxmanifest.lua de quien llama:
dependency 'my_inventory'Luego FiveM inicia my_inventory primero, y se rehúsa a iniciar el script sin ella. Más sobre ordenamiento en server.cfg resource order.
Dos trampas relacionadas:
- La exportación se registra tarde.
exports('Name', fn)se ejecuta cuando se alcanza la línea. Si el archivo genera un error por encima de ella, o la registra después de un largoWait, los que llaman que se ejecutan mientras tanto fallan. Registra las exportaciones cerca de la parte superior del archivo. - Una llamada en tiempo de carga. Una llamada de nivel superior como
local count = exports['my_inventory']:GetItemCount('water')se ejecuta en el momento en que se carga tu archivo. Muévela a un evento o un hilo, o asegúrate de que la dependencia ya se está ejecutando.
También puedes proteger una integración opcional con pcall y con una verificación de que el recurso se está ejecutando:
if GetResourceState('my_inventory') == 'started' then
local ok, count = pcall(function()
return exports['my_inventory']:GetItemCount('water')
end)
endGetResourceState devuelve 'started', 'stopped', 'missing' u otros estados, así que también puedes registrar cuál es el caso. Para una mirada más profunda de cómo funcionan las exportaciones, lee FiveM exports in Lua.
6. Reiniciaste un recurso, no el otro
Reiniciar un proveedor mientras el servidor se ejecuta no siempre reconecta los scripts que contienen sus objetos. Después de reiniciar o actualizar un proveedor, reinicia los scripts que lo llaman, o reinicia el servidor.
Lista de verificación
| Síntoma | Solución |
|---|---|
| Recurso no en la consola al inicio | Añade ensure my_inventory a server.cfg |
Couldn't start resource por encima del error |
Soluciona el propio error del proveedor primero |
| Carpeta renombrada | Usa exactamente el nombre de la carpeta en exports['name'] |
| Exportación llamada desde el lado incorrecto | Llámala desde el lado que la define, o usa un evento/devolución de llamada |
| Error después de una actualización | La exportación fue renombrada o eliminada; verifica la lista actual de exportaciones del proveedor |
| Error solo al inicio | Pon el proveedor por encima de quien llama; añade una línea dependency |
| Aún fallando después de reiniciar un proveedor | Reinicia los scripts que lo llaman |
Respuestas rápidas
¿Qué significa 'No such export X in resource Y'?
Un script llamó a exports['Y']:X() y el recurso Y no tenía una exportación llamada X en ese momento. Y no se está ejecutando, tiene un nombre diferente, define X en el otro lado, o no tiene esa exportación en esta versión.
¿El nombre del recurso distingue mayúsculas de minúsculas?
Trátalo como sensible a mayúsculas: el nombre en exports['name'] tiene que coincidir exactamente con el nombre de la carpeta, incluyendo guiones y guiones bajos. Esto es especialmente importante en servidores Linux.
¿El orden de ensure soluciona este error?
A menudo, sí. Los recursos se inician en el orden de server.cfg, así que pon el recurso que proporciona la exportación por encima del que la llama, o añade una línea dependency al fxmanifest.
Scripts que evitan este problema
Mic PhoneUn móvil plegable que se abre en tablet y llega al móvil real del jugador.Ver script →
CCTV Security CamerasCámaras colocables, una tablet con vista múltiple en vivo y fotos como prueba.Ver script →
Item Creator V2Crea items usables con animaciones, props, efectos y más — sin escribir código.Ver script →