Package.JSON
Package.JSON

Reputation: 301

Node: VM12:1 POST http://localhost:3000/auth net::ERR_CONNECTION_REFUSED

I am new to fullstack development and I want to deploy a project that will be used on the same network by different users. I have used angular for the front-end and node/express and MySQL for the backend. Before proper deployment, for testing purposes, I am accessing my application from another computer that is on the same network. The application, however, is throwing an error when I try to login.

VM12:1 POST http://localhost:3000/auth net::ERR_CONNECTION_REFUSED

Here's my backend code:

server.js

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const mysqlConnection = require('./connection');
const routes = require('./routes');

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

var app = express();

app.disable('x-powered-by');

app.use(express.static(__dirname + '/dist'));

app.get('/*', (req, res) => res.sendFile(path.join(__dirname)));

app.use(cors());

app.use(bodyParser.json());

app.use(routes);

const port = process.env.PORT || 3000;

const server = http.createServer(app);

server.listen(port, '0.0.0.0', () => console.log(`Running on port ${port}`));

routes.js

router.post("/auth", (req, res) => {

var email = req.body.email;
var password = req.body.password;
var accessBasic = "Basic";
var accessPremium = "Premium";

mysqlConnection.query("SELECT * FROM authorization WHERE email = ? AND password = ?", [email, 
password], (err, results) => {

  if(!err)
  {
    var myJSON = JSON.stringify(results);
    var check_email = myJSON.search(/email/i);
    var check_password = myJSON.search(password);
    var check_access = myJSON.search(accessBasic);
    var check_access2 = myJSON.search(accessPremium);

    if ((check_email != -1) && (check_password != -1) && (check_access != -1))
    {
      res.send("Successfully Authorized to Basic Access");
    }
    else if ((check_email != -1) && (check_password != -1) && (check_access2 != -1))
    {
      res.send("Successfully Authorized to Premium Access");
    }
    else
    {
      res.send("Authorization failed");
    }
  }
  else
  {
    console.log("Connection to authorization failed: " + err.message);
  }
})

})

I have allowed incoming connections in my firewall and done everything but, couldn't find the reason why my endpoint is refusing to connect while trying to connect on device other than my system on the same network. I don't know what's wrong. Anybody has any idea what am I doing wrong? I have hosted my application on my system and accessing it from another on the same network.

EDIT: Since, this question has gained quite a lot of views, I would like to mention that I didn't change any of the firewall settings as mentioned above. All the default firewall settings of the Windows OS were used. I just deployed the app and ran it.

ANSWER: I was having an issue on the front-end. I was targeting localhost instead of the IP address of the system that the app was hosted on. See my answer below for the details.

Upvotes: 1

Views: 9669

Answers (3)

Vlad Pop
Vlad Pop

Reputation: 11

I have experienced the same issue with MongoDB

I have found out that the problem was my MongoDB wasn't connected to my localhost and the issue was related to tokens and authentication.

So I went to my terminal on my backend folder and ran the command - npm install dotenv --save

Then I created my .env file located in my backend folder and added the following commands

PORT=3000 APP_SECRET="RANDOM_TOKEN_SECRET"
MONGODB="mongodb+srv://youruser:[email protected]/?retryWrites=true&w=majority"

Then called it in my app.js file

const dotenv = require("dotenv");

dotenv.config();

mongoose.connect(process.env.MONGODB,
  { useNewUrlParser: true,
    useUnifiedTopology: true })
    .then(() => console.log('Connected to MongoDB!'))
    .catch(() => console.log('Failed to connect to MongoDB !'));
    
    module.exports = app;

Finally I have added it in my backend/controllers/user.js

const token = jwt.sign(
    {userId: user._id},
    process.env.APP_SECRET,
    {expiresIn: '24h'});
    res.status(200).json({
    userId: user._id,
    token: token
});

Upvotes: 1

Package.JSON
Package.JSON

Reputation: 301

For anyone who is going to see this in future. I was having an error on my front-end. Instead of calling http://localhost:3000/name-of-my-api-endpoint, I changed the localhost to the IP address of my system and then ran ng build --prod again in order to make new static files and serve them from node.js.

Upvotes: 3

Zouari Khalil
Zouari Khalil

Reputation: 31

You can access your app in the same network from your @IP not from localhost (127.0.0.1) change it to 192.168.1.X (your local @IP address) and make sure to changed it in your .env file.

Upvotes: 0

Related Questions