简体   繁体   中英

dyld: Symbol not found: _napi_module_register

Had my node working with the VS Code debugger last night no problem. I haven't touched anything besides install the npm mysql package.

I come back tonight and its throwing this error:

Debugger listening on [::]:49952
dyld: lazy symbol binding failed: Symbol not found: _napi_module_register
  Referenced from: /Users/adamsawyers/node_modules/bufferutil/prebuilds/darwin- 
 x64/node-napi.node
  Expected in: flat namespace
dyld: Symbol not found: _napi_module_register
  Referenced from: /Users/myusername/node_modules/bufferutil/prebuilds/darwin- 
 x64/node-napi.node
  Expected in: flat namespace

Apparently my installation of n (a node version handling package in npm) is busted somehow. My research told me that napi_module_register is part of the n package, but I'm not sure how this got messed up especially since I had it working last night.

I tried reinstalling my node packages, reinstalling n, rebuilding the project file structure, even restarting my computer. Nothing has worked so far.

Any suggestions?

Apparently VS code doesn't like v6.10.3 of nodejs which I am running to create lambda functions in AWS (that is the version specified by AWS)

I use the N package to manage my node version. After switching to the latest version 10.7.0 as of 07/25/2018 (command: sudo n latest) and rerunning the debugger in VS code, it worked perfectly

I'm still unsure as the the cause, but hopefully others find this solution helpful

This exact error happened to me because:

  1. I needed socket.io to run on Node
    • Which in turn needs ws (websockets on Node)
  2. Also, I needed to run this on an outdated Node version (Node 7) for a very good reason (believe me, I would not want to do this if I wouldn't have to)
  3. However, trying to use it on that old version causes above error message.

Solution

This is a terrible solution, but at least I got it to work.

After some researching, I found no good solution to this. However, a close look at the source code shows that there is a fallback.js next to index.js which implements the same functionality as the native build but without needing a build. This will probably slow things down significantly, but at least it works:

  1. yarn add module-alias
  2. prefix your actual code with this (eg via node -r fallbacks.js ):
// fallbacks.js
const moduleAlias = require('module-alias');

const dependencyRoot = getDependencyRoot(); // whatever is your root folder, maybe __dirname + '..'

moduleAlias.addAlias('bufferutil', dependencyRoot + '/node_modules/bufferutil/fallback.js');
moduleAlias.addAlias('utf-8-validate', dependencyRoot + '/node_modules/utf-8-validate/fallback.js');


// run actual code here...

PS: In my case, in order to allow ws to run on Node 7, I also had to babel it, since its using modern synytax.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM