1

I'm fairly new to Node.js and I am having some issues.

I received the following error when i try to open 127.0.0.1:3000/bejelentkezes:

POST /bejelentkezes 500 550.784 ms - 2259
GET /css/404.css 304 2.751 ms - -
1
sikeres bejelentkezes
Error: Can't set headers after they are sent.
    at ServerResponse.setHeader (_http_outgoing.js:371:11)
    at ServerResponse.header (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:730:10)
    at ServerResponse.send (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:170:12)
    at done (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:967:10)
    at Object.exports.renderFile (C:\Users\denes\Documents\e_wallet\node_modules\pug\lib\index.js:412:12)
    at View.exports.__express [as engine] (C:\Users\denes\Documents\e_wallet\node_modules\pug\lib\index.js:455:11)
    at View.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\view.js:128:8)
    at tryRender (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\application.js:640:10)
    at Function.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:971:7)

This is my code:

var express = require('express');
var router = express.Router();
var tools = require('./adatbazis_v2');

router.get('/', function(req, res, next) {
  res.render('login');
});

router.post('/', function(req,res,next) {
  if (!req.body.email || !req.body.password) {
    console.log('valami nincs kitoltve');
  } else {
      tools.checkUser(req.body.email, req.body.password, function(callback) {
        if(callback == 1){
          console.log("sikeres bejelentkezes");
          res.render('index');
        } else {
          console.log('sikertelen bejelentkezes');
          res.render('login');
        }
      });
    }
});

module.exports = router;

and this is the function:

checkUser: function (felhasznalonev, jelszo, callback) {

      connection.connect(function(err) {
        if (err) {
          console.error('error connecting: ' + err.stack);
          return;
        }
      });

      connection.query('SELECT COUNT(*) AS szamlalo FROM felhasznalok WHERE fhsz_email="' +
      felhasznalonev + '" AND fhsz_jelszo= "' + md5(jelszo) +'";', function (error, results, fields) {
        console.log(results[0].szamlalo);
        callback(results[0].szamlalo);
      });

      connection.close();
  }

EDIT 1: I updatet my code, but I still receiving error.

router.post('/', function(req,res,next) {
  var l_status = 0;
  console.log('l_status: '+l_status);
  if (!req.body.email && !req.body.password) {
    console.log('valami nincs kitoltve');
  } else {
      l_status = tools.checkUser(req.body.email, req.body.password, function(callback) {
        return callback;
      });
      if(l_status == 1)
        res.render('index');
      else
        res.render('login');
    }
});

Error:

GET /bejelentkezes 304 1776.456 ms - -
GET /css/signin.css 304 5.524 ms - -
GET /favicon.ico 200 7.638 ms - 32038
l_status: 0
POST /bejelentkezes 500 728.901 ms - 2259
GET /css/404.css 304 13.212 ms - -
1 (this is checkuser output)

EDIT 2 - More information

App.JS:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');

var index = require('./routes/index');
var users = require('./routes/users');
var login = require('./routes/login');
var notfound = require('./routes/error');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.set('trust proxy', 10);

app.use(session({
  secret: 'E355A874F571C',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

// Authentication and Authorization Middleware
var auth = function(req, res, next) {
  if (req.session && req.session.user === "denes" && req.session.admin)
    return next();
  else
    return res.sendStatus(401);
};

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/rogzit', index);
app.use('/bejelentkezes', login);
app.use('/404', notfound);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  /*var err = new Error('Not Found');
  err.status = 404;
  next(err); */

  req.redirect('/404');
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

package.json:

{
  "name": "e_wallett",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.17.1",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.3",
    "express": "~4.15.2",
    "morgan": "~1.8.1",
    "pug": "~2.0.0-beta11",
    "serve-favicon": "~2.4.2"
  }
}

Adatbazis_v2.JS:

var mysql = require('mysql');
var md5 = require('md5');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'usr',
  password : 'pw',
  database : 'dbname'
});

module.exports = {
    checkUser: function (felhasznalonev, jelszo, callback) {

      connection.connect(function(err) {
        if (err) {
          console.error('error connecting: ' + err.stack);
          return;
        }
      });

      connection.query('SELECT COUNT(*) AS szamlalo FROM felhasznalok WHERE fhsz_email="' +
      felhasznalonev + '" AND fhsz_jelszo= "' + md5(jelszo) +'";', function (error, results, fields) {
        console.log(results[0].szamlalo);
        callback(results[0].szamlalo);
      });

      connection.close();
  },

    getTranzakciok: function () {

      connection.connect(function(err) {
        if (err) {
          console.error('error connecting: ' + err.stack);
          return;
        }
      });

      connection.query('SELECT * FROM tranzakciok";', function (error, results, fields) {
        console.log(results[0]);
      });
  }
}

412th line of pug's index.js:

 // support callback API
  if ('function' == typeof options) { //412th LINE
    fn = options, options = undefined;
  }
  if (typeof fn === 'function') {
    var res;
    try {
      res = exports.renderFile(path, options);
    } catch (ex) {
      return fn(ex);
    }
    return fn(null, res);
  }

  options = options || {};

  options.filename = path;
  return handleTemplateCache(options)(options);
};

I apologize for my English mistakes and thank u for helping.

Crowor
  • 23
  • 5
  • Tough to say from the code you posted, [this question](https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client) might be relevant. Specifically, if the callback passed to `checkUser` is getting called twice somehow, that might be the cause. – bmceldowney May 31 '17 at 23:58
  • I have this issue whenever res.whatever is getting called twice. I fix this generally by refactoring to make sure code is being executed in the proper order as well as adding 'return' prior to my responses because you should only be sending one response. – reedb89 Jun 01 '17 at 23:56
  • @reedb89 Thank you for your reply. I updated my code, but it still does not work. – Crowor Jun 02 '17 at 15:34

1 Answers1

0

Try this code:

router.post('/', function(req,res,next) {
  var l_status = 0;
  console.log('l_status: '+l_status);
  if (!req.body.email && !req.body.password) {
    console.log('valami nincs kitoltve');
  } else {
      tools.checkUser(req.body.email, req.body.password, function(result) {
        if(result== 1)
          return res.render('index');
        else
          return res.render('login');
      });
    }
});


checkUser: function (felhasznalonev, jelszo, callback) {

  connection.connect(function(err) {
    if (err) {
      console.error('error connecting: ' + err.stack);
      return;
    }

    connection.query('SELECT COUNT(*) AS szamlalo FROM felhasznalok WHERE fhsz_email="' + felhasznalonev + '" AND fhsz_jelszo= "' + md5(jelszo) +'";', function (error, results, fields) {
      console.log(results[0].szamlalo);
      return callback(results[0].szamlalo);
    });

    connection.close();
  });

}

You can only use the result passed to the callback function inside the callback.

I suggest that you read some documentation/tutorials on async programming before starting to code using nodejs. You can start by this website.

EDIT: new code for the checkUser function

G3ph4z

Thank u, I'll be reading it. I tried ur code and I got this error:

GET /bejelentkezes 304 1733.043 ms - -
GET /css/signin.css 304 3.785 ms - -
l_status: 0
POST /bejelentkezes 500 714.691 ms - 2259
GET /css/404.css 304 3.594 ms - -
1
Error: Can't set headers after they are sent.
    at ServerResponse.setHeader (_http_outgoing.js:371:11)
    at ServerResponse.header (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:730:10)
    at ServerResponse.send (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:170:12)
    at done (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:967:10)
    at Object.exports.renderFile (C:\Users\denes\Documents\e_wallet\node_modules\pug\lib\index.js:412:12)
    at View.exports.__express [as engine] (C:\Users\denes\Documents\e_wallet\node_modules\pug\lib\index.js:455:11)
    at View.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\view.js:128:8)
    at tryRender (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\application.js:640:10)
    at Function.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\Users\denes\Documents\e_wallet\node_modules\express\lib\response.js:971:7)