How to pass data "controller" instead of "app.js" in Nodejs

Issue

I am working on Nodejs(Express.js),I am sending Form data to controller but not working for me,I am getting error "TypeError: Cannot read property ‘name’ of undefined in Nodejs", But Main problem is my code is working/getting data in "app.js" but i want to get data in "userController" because i want to use MVC strtucre,Here is my root.js

var express=require('express');
var router= express.Router();
var controllers= require('../controllers');
router.get('/', controllers.homeController.index);
router.get('/signup', controllers.userController.signup);
router.post('/signup', controllers.userController.save);
router.get('/login', controllers.userController.login);
router.get('/dash', controllers.userController.dash);
module.exports = router;

Here is my userController.js file

userController.save = function (req, res, next) {
    var name = req.body.name;
    console.log(name);   
}

Here is my app.js, How can i get data in "userController" instead of "app.js",Thank you in advance.

const express = require('express');
const mysql = require('mysql');
const expressValidator = require('express-validator');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const flash = require('connect-flash');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use('/', routes);
app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(__dirname + '/public'));
app.use(cookieParser('keyboard cat'));
const PORT = 4000
app.listen(PORT, function (err) {
  if (err) console.log(err);
  console.log("App started on PORT", PORT);
});

Solution

I have reorganized your codes. Please make sure your filte path declaration is correct.

    var express=require('express');
    var router = express.Router();
    var controllers= require('../controllers/userController'); // if userController.js in controller folder.
    router.get('/', controllers.homeController_index);
    router.get('/signup', controllers.userController_signup);
    router.post('/signup', controllers.userController_save);
    router.get('/login', controllers.userController_login);
    router.get('/dash', controllers.userController_dash);
    module.exports = router;

userController.js

const userController_save = function (req, res, next) {
    var name = req.body.name;
    console.log(name);   
}

app.js

    const express = require('express');
    const mysql = require('mysql');
    const expressValidator = require('express-validator');
    const bodyParser = require('body-parser');
    const cookieParser = require('cookie-parser');
    const session = require('express-session');
    const flash = require('connect-flash');
    const path = require("path");
    const app = express();

    const routes = require('./routes/root'); // If your root.js inside a routes folder

    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    
    app.set('view engine', 'pug');
    app.set('views', path.join(__dirname, 'views'));
    app.use(express.static(__dirname + '/public'));
    app.use(cookieParser('keyboard cat'));

    app.use('/', routes);

    const PORT = 4000
    app.listen(PORT, function (err) {
      if (err) console.log(err);
      console.log("App started on PORT", PORT);
    });

Answered By – Titan XP

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published