TypeError: cannot read property of undefined (ExpressJS/POST)

10,542

Solution 1

body-parser is not the part of express. Install it separately using npm install body-parser --save and then use it as middleware. check the code after line where you commented express.bodyParser() middleware

var cool = require('cool-ascii-faces');
var express = require('express');

var app = express();
var pg = require('pg');
var bodyParser = require('body-parser');
var env = require('node-env-file');

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/views/'));

// views is directory for all template files
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

//app.use(express.bodyParser());

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


//DIFFERENT APPS - tells them what to do

app.post('/search', function(request, response) {
    //var username = req.body;

    console.log("posted something"+ request.body.searcher);
    response.end("something was posted: "+ request.body.searcher);
});

app.get('/search', function(request, response) {
     response.send("skylarr");

});

Solution 2

There is no body property on a standard Node.JS HTTP request. That key is patched on by the bodyParser middleware.

You can either add the bodyParser middleware, or (if you don't want to parse the body for some reason) use query or URL parameters to pass searcher.

Solution 3

You are missing the body parser. You need to tell express to use the body parser as a middleware.

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

Add these two lines above the app.post().

Share:
10,542
blue
Author by

blue

Updated on June 25, 2022

Comments

  • blue
    blue almost 2 years

    I have looked at all similar questions and none are working for me. I have a node js app in which I cannot print the input text from a form, using body-parser.

    My index.ejs:

             <form id="demo-2" method = "POST" action="/search">
    <input type="search" name = "searcher" placeholder="Search">
                        </form>
    

    Index.js:

    var cool = require('cool-ascii-faces');
    var express = require('express');
    
    var app = express();
    var pg = require('pg');
    var bodyParser = require('body-parser');
    var env = require('node-env-file');
    
    app.set('port', (process.env.PORT || 5000));
    app.use(express.static(__dirname + '/views/'));
    
    // views is directory for all template files
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    
    //app.use(express.bodyParser());
    
    
    //DIFFERENT APPS - tells them what to do
    
    app.post('/search', function(request, response) {
        //var username = req.body;
    
        console.log("posted something"+ request.body.searcher);
        response.end("something was posted: "+ request.body.searcher);
    });
    
    app.get('/search', function(request, response) {
         response.send("skylarr");
    
    });
    

    And despite using the input's name searcher I get error: TypeError: Cannot read property 'searcher' of undefined

    What is wrong here?

  • blue
    blue almost 7 years
    Sorry I'm new to this. Can you give an example of those 2 options?
  • Khurram
    Khurram almost 7 years
    @skyguy you told in above comment if you un comment bodyParser that create an error regarding middle ware. I want to tell that bodyParser is not the part of express. install and use it separately.
  • KylianMbappe
    KylianMbappe almost 4 years
    Doesn't work for me, still displaying the exact same error