Node-postgres: when using babel, pg-native is always required (and fails if not present)

Created on 18 Aug 2015  Â·  30Comments  Â·  Source: brianc/node-postgres

I'm not sure if this is a Babel or a node-postgres bug, steps to reproduce:

export PATH=$PATH:/tmp/iojs-v3.0.0-linux-x64/bin/:./node_modules/.bin
mkdir t
cd t
npm install babel pg

# create a t.js file with this ES6 content:
import * as pg from "pg";
console.log(pg);

# now execute: 
babel t.js > t-es5.js
node t-es5.js 

Error: Cannot find module 'pg-native'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/tmp/o/node_modules/pg/lib/native/index.js:1:76)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)

Babel generates the following code in t-es5.js:

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }

var _pg = require("pg");

var pg = _interopRequireWildcard(_pg);

console.log(pg);

The exception is happening in the _interopRequireWildcard(_pg) call. This doesn't happens with other libraries, so I'm not sure if a Babel or a node-postgres bug.

Most helpful comment

Another solution (if using webpack), is to add new webpack.IgnorePlugin(/^pg-native$/) to your webpack config's plugins array. E.g.

const webpackConfig = {
  ...
  resolve: { ... },
  plugins: [
    new webpack.IgnorePlugin(/^pg-native$/)
  ],
  output: { ... },
  ...
}

All 30 comments

+1 using webpack + babel + typescript
ERROR in ./~/pg/lib/native/index.js
Module not found: Error: Cannot resolve module 'pg-native' in /Volumes/DATA/SOA/2015/github/typescript_babel_react_express_dev/node_modules/pg/lib/native
@ ./~/pg/lib/native/index.js 1:13-33

comment this lines in node_modules/pg/lib/index.js
if(typeof process.env.NODE_PG_FORCE_NATIVE != 'undefined') {
//module.exports = new PG(require('./native'));
} else {
module.exports = new PG(Client);

//lazy require native module...the native module may not have installed
// module.exports.defineGetter("native", function() {
// delete module.exports.native;
// module.exports.native = new PG(require('./native'));
// return module.exports.native;
// });
}

pg define getter in module.exports
https://github.com/brianc/node-postgres/blob/master/lib/index.js#L76

  //lazy require native module...the native module may not have installed
  module.exports.__defineGetter__("native", function() {
    delete module.exports.native;
    module.exports.native = new PG(require('./native'));
    return module.exports.native;
  });

when babel rewrite code, him not found __esModule property in module and make copy of module props to new hash. in copy process pg.native called unintentionally. has no idea, how to fix this

function _interopRequireWildcard(obj) { //obj is pg module
  if (obj && obj.__esModule) {  //<===== test to something
    return obj; 
  } else { 
    var newObj = {}; 
    if (obj != null) { 
      for (var key in obj) { 
        if (Object.prototype.hasOwnProperty.call(obj, key)) 
          newObj[key] = obj[key];  //<== call getter here
      } 
    } 
    newObj["default"] = obj; 
    return newObj; 
  } 
}

This might help you:

import pg from 'pg'

Any progress with this issue?

I'm not experiencing this issue. I also using import pg from 'pg'. This can be solution I think.

import pg from 'pg' does _not_ work for me - I am seeing the pg-native error.

@nybble73 What code generates babel for `import pg from 'pg'? Which versions?

This issue can be fixed only by wrapping pg.native getter to try/catch.

@brianc Should I prepare pull request?

My suggestion is return null if require('pg-native') fail

Another option is return this itself and write once an error to stdout

sure thing - pull request always welcome!

On Wed, Feb 24, 2016 at 3:08 PM, Pavel Lang [email protected]
wrote:

@brianc https://github.com/brianc Should I prepare pull request? My
suggestion is return null if require('pg-native') fail

—
Reply to this email directly or view it on GitHub
https://github.com/brianc/node-postgres/issues/838#issuecomment-188453312
.

Still facing the same issue on "pg": "^6.1.5".

I'm too facing it, using Webpack and AWS Lambda.
This comment workaround worked (just the alias/pg-native.js part):
https://github.com/elastic-coders/serverless-webpack/issues/78#issuecomment-271336996

Still having this issue bundling with webpack. Installing pg-native fixes the issue.

I also couldn't bundle pg in my Typescript + Webpack2 + Lambda project until I installed pg-native and set the webpack config output: 'node'. Small example project: https://github.com/craigsnyders/serverless-typescript-starter

I'm also unclear if this is an issue with node-postgres or webpack. Normally webpack will resolve all dependant modules perfectly.
For reference, here's the webpack error when I haven't got pg-native in my package.json

ERROR in ./~/pg/lib/native/index.js
Module not found: Error: Can't resolve 'pg-native' in '/Users/csnyders/workspace/serverless-typescript-starter/node_modules/pg/lib/native'
 @ ./~/pg/lib/native/index.js 9:13-33
 @ ./~/pg/lib/index.js
 @ ./src/hello.ts
 @ ./src/handler.ts

I also get the same error with pg 7.4.3 using webpack and typescript.

 ModuleNotFoundError: Module not found: Error: Can't resolve 'pg-native' in '/xxx/node_modules/pg/lib/native'

Another solution (if using webpack), is to add new webpack.IgnorePlugin(/^pg-native$/) to your webpack config's plugins array. E.g.

const webpackConfig = {
  ...
  resolve: { ... },
  plugins: [
    new webpack.IgnorePlugin(/^pg-native$/)
  ],
  output: { ... },
  ...
}

@adieuadieu 's solution worked. need to make sure you have installed webpack and imported in config file. Also, give and comma ( , ) after "plugin [ ... ]" and before "output:"

npm install --save webpack

var webpack = require('webpack'); const webpackConfig = { ... resolve: { ... }, plugins: [ new webpack.IgnorePlugin(/^pg-native$/) ], output: { ... } ... }

@brianc @amit-dhara @adieuadieu
I'm experiencing the same problem.
I installed

"pg": "^8.0.2",
"pg-hstore": "^2.3.3",
"sequelize": "^5.21.6",

[email protected] and Node: 12.15.0

this is the pg.js I'm using:

const { Pool } = require('pg');
const pool = new Pool();
module.exports = {
  query: (text, params, callback) => {
    return pool.query(text, params, callback);
  },
}

I also specified in webpack.config.js :

{
    "mode": "development",
    plugins: [
      new webpack.IgnorePlugin(/^pg-native$/, /^dns$)
    ],

When compiling:

npm run serve
 ERROR  Failed to compile with 2 errors                                         

These dependencies were not found:

* dns in ./node_modules/pg/lib/connection-parameters.js
* pg-native in ./node_modules/pg/lib/native/client.js

To install them, you can run: npm install --save dns pg-native

How to solve the problem?

Marco

This still seems to be an issue, so unsure why it was closed

@GeorgeWL The original issue was closed with a fix. If you’re seeing something new or something that appears to be the same, please include details.

Seeing the same, using this alongside webpack, webpack fails to correctly compile it when using TypeScript.

The workaround of adding pg-native to a webpack ignorePlugin still seems to fix it.

I think the original issue asks about babel, which seems to be still an issue. E.g. when using parcel, get the same errors:

🚨  /.../node_modules/pg/lib/native/client.js:11:21: Cannot resolve dependency 'pg-native'

Nothing worked for me, so I created a manual fix myself

create a fix.js file at the root of the project:

const fs = require('fs');
const path = require('path');

const pgClientPath = path.resolve(__dirname, 'node_modules', 'pg', 'lib', 'native', 'client.js');

fs.readFile(pgClientPath, 'utf8', function(err, data) {
  if (err) {
    return console.log(err);
  }

  const result = data.replace("var Native = require('pg-native')", 'var Native = null');

  fs.writeFile(pgClientPath, result, 'utf8', function(err) {
    if (err) return console.log(err);
  });
});

to run the patch file whenever you update or install a new dependency, add it to the package.json file:

"scripts:": {
  "postinstall": "node fix.js"
}

If you are using sequelize, make the following configuration in the configuration part:

import * as pg from 'pg';  // import pg

const database = 'myDB';
const dialect = 'postgres';
const host = 'locahost';
const port = 5432;
const username = 'myUser';
const password = 'myPass';

export default {
  dialect,
  dialectModule: pg,
  username,
  password,
  database,
  host,
  port,

  define: {
    timestamps: true,
    underscored: true,
    underscoredAll: true,
  },
};

@antonycms thanks so much! struggled with this issue and your solution works like a charm!

An alternative workaround is to create a local pg-native package and reference it from your package.json

{
  "name": "your-module",
  "private": true,
  "dependencies": {
    "pg": "^8.3.3",
    "pg-native": "file:./modules/pg-native",
  }
}

The index.js file in the pg-native folder only has to contain

module.exports = null;

and a basic package.json file like this:

{
  "name": "pg-native",
  "private": true,
  "main": "index.js"
}

is this actually fixed? or has it been closed due to workarounds?

npm install --save pg-native fixes this error, since pg specifies pg-native as an optional peer dependency.

npm install --save pg-native fixes this error, since pg specifies pg-native as an optional peer dependency.

that's not a fix, that's a workaround. keyword: optional

¯\_(ツ)_/¯ anything that unblocks me is a fix.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

gpanainte picture gpanainte  Â·  3Comments

v1co1n picture v1co1n  Â·  4Comments

spollack picture spollack  Â·  4Comments

joaquimknox picture joaquimknox  Â·  3Comments

dindurthy picture dindurthy  Â·  4Comments