Zachary Abresch
Zachary Abresch

Reputation: 796

How can I resolve `Error: Could not locate the bindings file.` when using `node-ffi`?

Some details:

I recently built an npm package that interacts with a shared C library using ffi. The package works perfectly on its own (built with babel). I'm trying to integrate it into a proof-of-concept app and am running into lots of problems with bindings. I'm using webpack to bundle my POC app and that's where I'm running into this issue.

Here's my webpack.config.js:

/* eslint-disable */
var webpack = require('webpack');
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

var buildPath = path.resolve(__dirname, 'wp-build/');

module.exports = [
  {
    name: 'frontend',
    entry: './src/frontend/index.js',
    output: {
      path: buildPath,
      filename: 'frontend.bundle.js',
    },
    module: {
      loaders: [{
        test: /\.js/,
        exclude: /(node_modules|build)/,
        loader: 'babel-loader',
      }],
    },
    plugins: [
      new HtmlWebpackPlugin(),
    ],
    devServer: {
      contentBase: buildPath,
      filename: 'frontend.bundle.js',
      publicPath: '/assets/',
      port: 8000,
      stats: {
        colors: true,
      },
    },
  },
  {
    name: 'backend',
    entry: './src/backend/server.js',
    output: {
      path: buildPath,
      filename: 'backend.bundle.js',
    },
    module: {
      loaders: [{
        test: /\.js/,
        exclude: /(node_modules|build|\.json|\.md)/,
        loader: 'babel-loader',
      }],
    },
    options: {
      symlinks: true,
    },
    target: 'node',
  },
];

The frontend task builds a bundle from this Javascript (ES6):

console.log('This is the frontend calling!!');

Simple right?

The backend task builds a bundle from this Javascript (ES6):

import Stack from 'stack-vod';

const stack = new Stack();
console.log(stack);

where stack-vod is my package that's using ffi.

Here's the package.json file for the POC app:

{
  "name": "stack-as-package",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "./node_modules/.bin/webpack",
    "dev": "./node_modules/.bin/webpack-dev-server"
  },
  "author": "Zachary Abresch <[email protected]>",
  "license": "MIT",
  "devDependencies": {
    "babel-core": "^6.17.0",
    "babel-eslint": "^7.0.0",
    "babel-loader": "^6.2.5",
    "babel-preset-es2015": "^6.16.0",
    "babel-preset-stage-0": "^6.16.0",
    "eslint": "^3.7.1",
    "eslint-config-airbnb": "^12.0.0",
    "eslint-plugin-import": "^1.16.0",
    "eslint-plugin-jsx-a11y": "^2.2.3",
    "eslint-plugin-react": "^6.4.1",
    "html-webpack-plugin": "^2.22.0",
    "webpack": "^1.13.2",
    "webpack-dev-server": "^1.16.2"
  },
  "dependencies": {
    "stack-vod": "[Private Gitlab Repository]"
  }
}

Here are the steps to replicate the issue:

  1. npm i
  2. npm run build
  3. node ./wp-build/backend.bundle.js

Step 1 works fine. Save for a few warnings, no errors when installing npm packages.

Step 2 Shows this output:

> [email protected] build /Users/zabresch/Documents/8x8/scratching/stack-as-package
> webpack

Hash: 513274db1b2b97352c7b3aed8d398daba0b6527f
Version: webpack 1.13.2
Child frontend:
    Hash: 513274db1b2b97352c7b
    Version: webpack 1.13.2
    Time: 859ms
                 Asset       Size  Chunks             Chunk Names
    frontend.bundle.js    1.45 kB       0  [emitted]  main
            index.html  191 bytes          [emitted]
        + 1 hidden modules
    Child html-webpack-plugin for "index.html":
            + 3 hidden modules
Child backend:
    Hash: 3aed8d398daba0b6527f
    Version: webpack 1.13.2
    Time: 949ms
                Asset    Size  Chunks             Chunk Names
    backend.bundle.js  137 kB       0  [emitted]  main
        + 40 hidden modules

    WARNING in ./~/bindings/bindings.js
    Critical dependencies:
    76:22-40 the request of a dependency is an expression
    76:43-53 the request of a dependency is an expression
     @ ./~/bindings/bindings.js 76:22-40 76:43-53

    WARNING in ./~/bindings/package.json
    Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/package.json Unexpected token (2:9)
    You may need an appropriate loader to handle this file type.
    SyntaxError: Unexpected token (2:9)
        at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
        at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
        at Parser.pp.semicolon (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:581:61)
        at Parser.pp$1.parseExpressionStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:966:10)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:730:24)
        at Parser.pp$1.parseBlock (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:981:25)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:709:33)
        at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
        at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
        at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
        at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
        at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
        at Storage.provide (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:52:20)
        at CachedInputFileSystem.readFile (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:140:24)
        at DependenciesBlock.onLoadPitchDone (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:255:7)
        at DependenciesBlock.loadPitch (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:182:27)
        at DependenciesBlock.doBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:241:4)
        at DependenciesBlock.build (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:84:14)
        at Compilation.buildModule (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:126:9)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:309:10
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:58:13
        at NormalModuleFactory.applyPluginsAsyncWaterfall (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/tapable/lib/Tapable.js:75:69)
        at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:38:11)
        at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:121:6)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:116:7
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:726:13
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:52:16
     @ ./~/bindings ^\.\/.*$

    WARNING in ./~/bindings/README.md
    Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/README.md Unexpected token (2:3)
    You may need an appropriate loader to handle this file type.
    SyntaxError: Unexpected token (2:3)
        at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
        at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
        at Parser.pp$3.parseExprAtom (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1822:12)
        at Parser.pp$3.parseExprSubscripts (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1715:21)
        at Parser.pp$3.parseMaybeUnary (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1692:19)
        at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1656:43)
        at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1658:21)
        at Parser.pp$3.parseExprOps (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1639:17)
        at Parser.pp$3.parseMaybeConditional (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1620:21)
        at Parser.pp$3.parseMaybeAssign (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1597:21)
        at Parser.pp$3.parseExpression (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1573:21)
        at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:727:47)
        at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
        at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
        at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
        at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
        at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
        at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
        at Storage.finished (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:38:16)
        at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/graceful-fs/graceful-fs.js:78:16
        at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:445:3)
     @ ./~/bindings ^\.\/.*$

Step 3 responds with this error:

/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2688
    throw err
    ^

Error: Could not locate the bindings file. Tried:
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/Debug/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/Release/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/default/binding.node
 → /Users/zabresch/Documents/8x8/scratching/stack-as-package/compiled/6.5.0/darwin/x64/binding.node
    at bindings (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2685:10)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:561:52)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:466:12)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:80:13)
    at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:455:31)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
    at Object.defineProperty.value (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:64:14)
    at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)

I've tried a ton of "fixes" I found on SO and GH but none of them have worked. Can anyone tell me what's going on here and what can be done to fix it? I've been slamming my head against this for days and 2 teammates spent days last week trying to figure this out too.

BTW, webpack is a requirement of my team as this will eventually be used on a larger project using electron and webpack is already being used to build there. So answers like "don't use webpack" won't cut the mustard. :)

Upvotes: 3

Views: 2601

Answers (1)

Ammar Hasan
Ammar Hasan

Reputation: 2516

First things first, you may need a json and an md file loader, do npm i -S json-loader and npm i -S file-loader, and then update this in webpack.config.js

"loaders": [{
    test: /\.js/,
    exclude: /(node_modules|build)/,
    loader: 'babel-loader',
 }, {
    test: /\.md(\?v=\d+\.\d+\.\d+)?$/,
    loader: "file"
 }, {
    test: /\.json$/,
    loader: 'json-loader'
 }]

If this does not resolve the issue, check if binding.node exists after doing this, and reply then I will update my answer.

Upvotes: 1

Related Questions