3

I'm currently designing a simple browser application utilizing express. I'm trying to extract the value a user selects in a drop down menu. I gave each option an individual value as well and have declared the method of the form as /post. but when I try which value they selected by going into the req.body, the value is undefined.

I recognize that the problem could lie with the body parser from browsing through similar questions (Example, Example1) but the solutions from these questions don't keep req.body from being undefined.

Here's my code for the app construction

const app = express()
app.use(express.static(__dirname, ''));
app.engine('html', require('ejs').renderFile);
app.set('views', __dirname + '/public/views');
app.use(express.urlencoded());
app.set('view engine', 'html');
const server = http.createServer(app);

And here's the code for the post handling

app.get('/detailed', function(req,res){
    res.send(displayDetailed(results, req));
});
app.post('/detailed', function(req,res){
    res.send('Hello world');
    console.log(req.body);

});

When I post something in localhost:8080/detailed, the hello world returns just fine, but req.body is an empty (returns as {}). The displayDetailed function is a custom function that returns a html string with values extracted from a get request from the google sheets API. Since I'm not working with a saved html document, could this be affecting the process?

dropTableUsers
  • 326
  • 3
  • 13
  • how do you call /detailed? I mean, how do you "post something"? Also, you're not using bodyParser as far as I'm concerned – Lyubomir May 28 '18 at 15:42
  • can you please tell how are you posting data? – Yamini Chhabra May 28 '18 at 15:45
  • Maybe this will solve your problem: https://stackoverflow.com/questions/9177049/express-js-req-body-undefined – Dvoliq May 28 '18 at 15:47
  • @YaminiChhabra I'm trying to post the result of a form that consists various selects and a submit button which triggers the post. However, this is done within an asynchronous function. Could this cause the bodyparser to skip over the result? – dropTableUsers May 28 '18 at 23:16
  • @dropTableUsers No, this should not be the reason, post your async function please. – Yamini Chhabra May 29 '18 at 04:38
  • `fs.readFile('client_secret.json', (err, content) => { if (err) return console.log('Error loading client secret file:', err); JSON.parse(content), extractAll); });` Where authorize is a function calling the authorization of a session for the Google Sheets API. extractAll simply makes a get request through the sheets API, manipulates the data and calls another function to return an html string. – dropTableUsers May 29 '18 at 15:51

4 Answers4

6

Most of the time req.body is undefined due to missing JSON parser

const express = require('express');
app.use(express.json());

could be missing for the body-parser

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

and sometimes it's undefined due to cros origin so add them

const cors = require('cors');
app.use(cors())
king neo
  • 2,141
  • 1
  • 17
  • 26
4

Did you setup the body parser for express to use? you can just npm install body-parser and then put these into your code.

const bodyParser = require('body-parser')
app.use(bodyParser.json())

Hope this can help!

Elvis Wong
  • 308
  • 2
  • 8
  • I gave that a shot but it did not work. However, the function call to generate the html is within an async function. Could this be throwing off the body parser? – dropTableUsers May 28 '18 at 23:17
  • Can you give me more details on how you make the api call and the function call to generate the html? Did you set header to application/json? I tried on postman just works with your code. – Elvis Wong May 29 '18 at 01:59
  • I made the API call with standard Google Sheets API commands. An example of what my code is based on is here https://developers.google.com/sheets/api/quickstart/nodejs. I did not set the header to json or application. – dropTableUsers May 29 '18 at 15:53
1

When calling req.body outside of the async function (where the function constructing the html was called), req.body returned perfectly fine. I'll be modifying my project to account for this. I should have put this in the original question, but it did not seem relevant when I was writing the question. Thanks to everyone who responded

dropTableUsers
  • 326
  • 3
  • 13
1

This will solve your issue:

App.use(bodyParser.urlencoded({extended: true}));
Stephen Rauch
  • 40,722
  • 30
  • 82
  • 105