"Failed to load native binding" with `@node-rs/bcrypt` + Expo Router API Routes (Metro bundler)
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 30/100
- Issue 类型
- 缺陷
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- javascript, nodejs, rust
- 领域
- backend, build-system
调研方向
从 packages/bcrypt/binding.js 开始,重点查看 requireNative 和原生 binding 的加载路径,然后将其与 app/hash+api.ts 中的 Metro 复现以及 Expo Router 配置进行比较。使用链接的项目复现该失败,并检查 Metro 如何解析 binding 候选项。API route 能够完成打包,并且 hashSync 运行时不再出现 undefined-module 或 failed-native-binding 错误,即视为完成。
由索引模型根据 Issue 内容生成。
描述
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
- 主要语言
- Rust
- 星标
- 1.5k
- 派生
- 52
- 平均合并
- 1 天 2 小时
- 30 天内合并 PR
- 14
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
napi-rs/node-rs 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 62/100
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 25/100
napi-rs/node-rs#1009 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 45/100
维护者通常 1 天内回复
-
[node-rs/jieba, lunr.zh error] top-level await is not available in the configured target environment未关闭
难度 4/5 3-5 天 新手友好度 25/100
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 35/100
维护者通常 1 天内回复
相似的 Issue
-
comp-formats
难度 2/5 半天 新手友好度 64/100
ClickHouse/ClickHouse#131694 ·
维护者通常 1 天内回复
-
cli: `execCargoMetadata` decodes stdout per chunk, corrupting non-ASCII paths across pipe boundaries未关闭
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 1 天内回复
-
enhancement
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
Copperpour/Copperpour#500 ·
维护者通常 1 天内回复
-
state:triage-needed
难度 1/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复