"Failed to load native binding" with `@node-rs/bcrypt` + Expo Router API Routes (Metro bundler)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 30/100
- Tipo de issue
- Error
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript, nodejs, rust
- Área
- backend, build-system
Línea de trabajo
Comienza con packages/bcrypt/binding.js, especialmente con requireNative y la ruta de carga del binding nativo; después compáralo con la reproducción de Metro en app/hash+api.ts y con la configuración de Expo Router. Reproduce el fallo con el proyecto enlazado e inspecciona cómo Metro resuelve los candidatos de binding. Se considera terminado cuando la ruta de API se empaqueta y hashSync se ejecuta sin los errores undefined-module o failed-native-binding.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Companion issue (expo/expo): https://github.com/expo/expo/issues/32350
Hi, first of all, thanks for these Rust libraries! Nice performance, and good options when the main bcrypt, etc packages don't work in a particular environment.
We are trying to use @node-rs/bcrypt in Expo Router API Routes (using Metro bundler), and we're getting some output that the native binding cannot be loaded (because it's "undefined", see further below):
Android Bundled 852ms node_modules/expo-router/entry.js (1049 modules)
λ Bundled 443ms app/hash+api.ts (4 modules)
Metro error: Failed to load native binding
357 | // - The user may need to bundle the correct files
358 | // - The user may need to re-install node_modules to get new packages
> 359 | throw new Error('Failed to load native binding', { cause: loadErrors })
| ^
360 | }
361 | throw new Error(`Failed to load native binding`)
362 | }
Call Stack
factory (node_modules/@node-rs/bcrypt/binding.js:359:11)
loadModuleImplementation (node_modules/metro-runtime/src/polyfills/require.js:277:5)
guardedLoadModule (node_modules/metro-runtime/src/polyfills/require.js:184:12)
require (node_modules/metro-runtime/src/polyfills/require.js:92:7)
factory (node_modules/@node-rs/bcrypt/index.js:1:84)
loadModuleImplementation (node_modules/metro-runtime/src/polyfills/require.js:277:5)
guardedLoadModule (node_modules/metro-runtime/src/polyfills/require.js:184:12)
require (node_modules/metro-runtime/src/polyfills/require.js:92:7)
factory (app/hash+api.ts:1)
loadModuleImplementation (node_modules/metro-runtime/src/polyfills/require.js:277:5)
ERROR [SyntaxError: JSON Parse error: Unexpected character: <]
I think Metro is not logging out the error cause, so adapting the node_modules/@node-rs/bcrypt/binding.js to log out loadErrors shows that it is using "undefined" as the module specifier:
if (!nativeBinding) {
if (loadErrors.length > 0) {
// TODO Link to documentation with potential fixes
// - The package owner could build/publish bindings for this arch
// - The user may need to bundle the correct files
// - The user may need to re-install node_modules to get new packages
+ console.log(loadErrors[0])
+ console.log(loadErrors[1])
+ console.log(loadErrors[2])
+ console.log(loadErrors[3])
throw new Error('Failed to load native binding', { cause: loadErrors })
}
throw new Error(`Failed to load native binding`)
}
This is repeated 4 times:
λ LOG Error: Requiring unknown module "undefined". If you are sure the module exists, try restarting Metro. You may also want to run `yarn` or `npm install`.
at unknownModuleError (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:322:10)
at loadModuleImplementation (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:244:11)
at guardedLoadModule (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:184:12)
at require (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:92:7)
at requireNative (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/@node-rs/bcrypt/binding.js:130:16)
at factory (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/@node-rs/bcrypt/binding.js:332:17)
at loadModuleImplementation (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:277:5)
at guardedLoadModule (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:184:12)
at require (/Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/metro-runtime/src/polyfills/require.js:92:7)
at /Users/k/p/repro-expo-router-api-routes-node-rs-bcrypt/node_modules/@node-rs/bcrypt/index.js:1:84
Reproduction
Creation steps:
mkdir repro-expo-router-api-routes-node-rs-bcrypt && cd repro-expo-router-api-routes-node-rs-bcryptnpx create-expo-app@latest .rm -r ./node_modules && npm install(forEMFILEerror)- Remove extra files
- Configure
app.jsonwithexpo.web.output = "server"andexpo.plugins[0][1] = { "origin": "http://localhost:8081" } - Create a file
app/hash+api.ts, with an Expo Router API Route, usinghashSyncfrom@node-rs/bcrypt - Inside
app/(tabs)/index.tsx, add afetch()of the API Route insideuseFocusEffect - 💥
npm startand observe the error after API Route bundling
- Lenguaje dominante
- Rust
- Estrellas
- 1.5k
- Forks
- 52
- Merge medio
- 1 d 2 h
- PR fusionados (30 d)
- 14
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de napi-rs/node-rs
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
napi-rs/node-rs#1009 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
Los mantenedores suelen responder en 1 día
-
[node-rs/jieba, lunr.zh error] top-level await is not available in the configured target environmentAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
Todos los issues de napi-rs/node-rs
Issues similares
-
comp-formats
Dificultad 2/5 Medio día Aptitud para principiantes 64/100
ClickHouse/ClickHouse#131694 ·
Los mantenedores suelen responder en 1 día
-
cli: `execCargoMetadata` decodes stdout per chunk, corrupting non-ASCII paths across pipe boundariesAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Copperpour/Copperpour#500 ·
Los mantenedores suelen responder en 1 día
-
state:triage-needed
Dificultad 1/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día