Re: Unable to connect to the database: TypeError: net.Socket is nota constructor - Mailing list pgsql-general

From Tim Cross
Subject Re: Unable to connect to the database: TypeError: net.Socket is nota constructor
Date
Msg-id 87h7xd4vww.fsf@gmail.com
Whole thread Raw
In response to Unable to connect to the database: TypeError: net.Socket is not a constructor  (Marco Ippolito <ippolito.marco@gmail.com>)
Responses Re: Unable to connect to the database: TypeError: net.Socket is not a constructor
List pgsql-general
Marco Ippolito <ippolito.marco@gmail.com> writes:

> I'm trying to connect to a postgres database (Postgresql-11) within my
> nodejs-vue.js app, but in console I'm getting this error:
>
>     [HMR] Waiting for update signal from WDS...
>     pg.js?c8c2:27 Unable to connect to the database: TypeError: net.Socket
> is not a constructor
>         at new Connection
> (webpack-internal:///./node_modules/pg/lib/connection.js:22:34)
>         at new Client
> (webpack-internal:///./node_modules/pg/lib/client.js:55:37)
>         at Promise.tap.query
> (webpack-internal:///./node_modules/sequelize/lib/dialects/postgres
>     /connection-manager.js:124:26)
>         at ConnectionManager.connect
> (webpack-internal:///./node_modules/sequelize/lib/dialects
>     /postgres/connection-manager.js:121:12)
>         at eval
> (webpack-internal:///./node_modules/sequelize/lib/dialects/abstract/connection-
>     manager.js:318:50)
>     From previous event:
>         at ConnectionManager._connect
> (webpack-internal:///./node_modules/sequelize/lib/dialects
>     /abstract/connection-manager.js:318:8)
>         at ConnectionManager.getConnection
> (webpack-internal:///./node_modules/sequelize/lib/dialects
>     /abstract/connection-manager.js:254:46)
>         at eval
> (webpack-internal:///./node_modules/sequelize/lib/sequelize.js:640:36)
>     From previous event:
>         at eval
> (webpack-internal:///./node_modules/sequelize/lib/sequelize.js:631:53)
>         at eval
> (webpack-internal:///./node_modules/retry-as-promised/index.js:70:21)
>         at new Promise (<anonymous>)
>         at retryAsPromised
> (webpack-internal:///./node_modules/retry-as-promised/index.js:60:10)
>         at eval
> (webpack-internal:///./node_modules/sequelize/lib/sequelize.js:631:30)
>     From previous event:
>         at Sequelize.query
> (webpack-internal:///./node_modules/sequelize/lib/sequelize.js:580:23)
>         at Sequelize.authenticate
> (webpack-internal:///./node_modules/sequelize/lib/sequelize.js:892:17)
>         at eval (webpack-internal:///./src/plugins/db/pg.js:23:11)
>         at Object../src/plugins/db/pg.js (https://ggc.world/js/app.js:1128:1
> )
>         at __webpack_require__ (https://ggc.world/js/app.js:785:30)
>         at fn (https://ggc.world/js/app.js:151:20)
>         at eval (webpack-internal:///./src/main.js:16:72)
>         at Module../src/main.js (https://ggc.world/js/app.js:1083:1)
>         at __webpack_require__ (https://ggc.world/js/app.js:785:30)
>         at fn (https://ggc.world/js/app.js:151:20)
>         at Object.1 (https://ggc.world/js/app.js:1141:18)
>         at __webpack_require__ (https://ggc.world/js/app.js:785:30)
>         at checkDeferredModules (https://ggc.world/js/app.js:46:23)
>         at https://ggc.world/js/app.js:861:18
>         at https://ggc.world/js/app.js:864:10
>
>  In /src/main.js :
>
>     import '@/plugins/db/pg';
>
>     (base) /src/plugins/db$ ls -lah
>     total 28K
>     drwxr-xr-x 6 marco marco 4,0K apr 20 15:42 .
>     drwxr-xr-x 3 marco marco 4,0K apr 20 15:41 ..
>     drwxr-xr-x 2 marco marco 4,0K apr 20 17:20 config
>     drwxr-xr-x 2 marco marco 4,0K apr 20 15:48 migrations
>     drwxr-xr-x 2 marco marco 4,0K apr 20 15:48 models
>     -rw-r--r-- 1 marco marco  819 apr 20 08:53 pg.js
>     drwxr-xr-x 2 marco marco 4,0K apr 20 17:21 seeders
>
>
> nano pg.js
>
>     const { Pool } = require('pg');
>     const { Sequelize } = require('sequelize');
>     const pool = new Pool();
>     const sequelize = new Sequelize('pusers', 'postgres', 'pwd', {
>       host: 'localhost',
>       dialect: 'postgres',
>       pool: {
>         max: 5,
>         min: 0,
>         acquire: 30000,
>         idle: 10000
>       }
>     });
>     sequelize
>       .authenticate()
>       .then(() => {
>         console.log('Connection has been established successfully.');
>       })
>       .catch(err => {
>         console.log('Unable to connect to the database:', err);
>       });
>
>     module.exports = {
>       query: (text, params, callback) => {
>         return pool.query(text, params, callback);
>       },
>     }
>
> Populated the sample database with a row:
>
>     pusers=# SELECT schemaname,relname,n_live_tup
>     pusers-#   FROM pg_stat_user_tables
>     pusers-#   ORDER BY n_live_tup DESC;
>      schemaname |    relname    | n_live_tup
>     ------------+---------------+------------
>      public     | pusers        |          1
>      public     | SequelizeMeta |          1
>     (2 rows)
>
> I read here:
> https://stackoverflow.com/questions/40599069/node-js-net-socket-is-not-a-constructor
> that
> "there are no plain TCP sockets in the browser, so that is why trying to
> use `net.Socket` in the browser (via webpack, browserify, etc.) won't work"
>
>     Environment Info:
>
>       System:
>         OS: Linux 5.3 Ubuntu 18.04.4 LTS (Bionic Beaver)
>         CPU: (8) x64 Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
>       Binaries:
>         Node: 12.15.0 - ~/.nvm/versions/node/v12.15.0/bin/node
>         Yarn: 1.22.4 - ~/.nvm/versions/node/v12.15.0/bin/yarn
>         npm: 6.14.4 - ~/.nvm/versions/node/v12.15.0/bin/npm
>       Browsers:
>         Chrome: 81.0.4044.92
>         Firefox: 75.0
>       npmGlobalPackages:
>         @vue/cli: 4.2.3
>
> So... how to solve the problem?
> Looking forward to your kind help.
> Marco

This has nothing to do with postgres. This is a purely Javascript issue
combined with differences between the browser Javascript API and node
javascript API.

Bottom line - if your trying to connect directly to a PG database from
within Javascript code running inside the browser, it won't work. The
browser does not have the 'net' library. You can only do this from
within node.js. Likewise, references to express are also red hearings -
you don't have a web server inside the browser either. If your not
trying to develop inside the browser but are in fact developing at the
node.js level, then you don't need webpack.

I think what you really need to do is step back and look closer at your
architecture. Typically, you would put all your database interaction
stuff in the web server using node.js. A common design pattern would be
to use one of the node.js web servers, like express (but there are
others) and have something like nginx as a proxy server in front of it.
You would then wrap your database interaction in a node.js API which you
would then call from your client browser using http/https or web
sockets. 

-- 
Tim Cross



pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Unable to connect to the database: TypeError: net.Socket is not aconstructor
Next
From: Marco Ippolito
Date:
Subject: Re: Unable to connect to the database: TypeError: net.Socket is not a constructor