0

I want to sign up a user. I saved the data to the database, but after that the error

Cannot read property 'firstname' of null occurs. had the idea that the body could be empty, but when I type console.log(req.body);, it shows the saved data. I think the problem is that the session is closed once I registered but I don't know how to fix this. I'd be glad if someone could help! Someone

var express = require("express");
var app = express();
var path = require("path");
const https = require("https");
const fs = require("fs");
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/WeSports");
var connection = mongoose.connection;
var bodyParser = require("body-parser");
var passport = require("passport");
var LocalStrategy = require("passport-local");
var User = require("./models/user.js");
const multer = require("multer");

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, "./uploads/");
  },
  filename: function(req, file, cb) {
    cb(null, new Date().toISOString() + file.originalname);
  }
});

const fileFilter = (req, file, cb) => {
  // reject a file
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
    cb(null, true);
  } else {
    cb(null, false);
  }
};

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 5
  },
  fileFilter: fileFilter
});

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use("/uploads", express.static("uploads"));
app.use(
  require("express-session")({
    secret: "Logged in",
    resave: false,
    saveUninitialized: false
  })
);

connection.once("open", function() {
  connection.db.collection("user-data", function(err, collection) {
    if (err) {
      console.error("An error occurred connecting to MongoDB: ", err);
    } else {
      collection.find({}).toArray(function(err, data) {
        if (err) {
          console.error("An error occurred connecting to MongoDB: ", err);
        } else {
          console.log(data); // it will print your collection data
        }
      });
    }
  });
});

app.set("view engine", "ejs");
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use("/", express.static(path.join(__dirname, "public")));
app.get("/", function(req, res) {
  var tagline = "Hello";
  res.render("Login", {
    tagline: tagline
  });
});

app.post("/insert", upload.single("picture"), function(req, res) {
  var user = {
    picture: req.file.path,
    firstname: req.body.firstname,
    name: req.body.name,
    city: req.body.city,
    birthday: req.body.birthday,
    phonenumber: req.body.phonenumber,
    email: req.body.email,
    aboutme: req.body.aboutme
  };
  var data = new User(user);
  data.save();
  console.log(req.body);
  User.register(
    new User({
      picture: req.file.path,
      username: req.body.username,
      firstname: req.body.firstname,
      name: req.body.name,
      city: req.body.city,
      birthday: req.body.birthday,
      phonenumber: req.body.phonenumber,
      _id: req.body.email,
      aboutme: req.body.aboutme
    }),
    req.body.password,
    function(err, User) {
      if (err) {
        console.log(err);
        return res.render("SignIn");
      } //user stragety
      passport.authenticate("local")(req, res, function() {
        res.redirect("/profile/" + req.body.email); //once the user sign
        up;
      });
    }
  );
  console.log(req.body);
});

app.get("/SignIn", function(req, res) {
  User.find().then(function(doc) {
    res.render("SignIn", { user: doc });
  });
});

app.post(
  "/",
  passport.authenticate("local", {
    failureRedirect: "/"
  }),
  (req, res) => {
    User.findOne({ username: req.body.username }, function(err, obj) {
      console.log(obj);
      console.log(obj._id);
      res.redirect("dashboard/" + obj._id);
    });
  }
);

var isLoggedIn = function(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect("/");
};

/*function(req, res){
res.send("User is "+ req.user.id);
});*/
app.param("id", function(req, res, next, _id) {
  User.findById(_id, function(err, doc) {
    if (err) res.json(err);
    else {
      req.userId = doc;
      next();
    }
  });
});
/* app.get('dashboard', (req, res, next) => {
upload.findOne({_id: req.params.id}, (err, image) => {
if (err) return res.sendStatus(404);
fs.createReadStream(path.resolve('./uploads', image.filename)).pipe(res);
});
});*/
app.get("/dashboard/:id", isLoggedIn, function(req, res) {
  res.render("dashboard", { user: req.userId });
});

app.get("/profile/:id", isLoggedIn, function(req, res) {
  res.render("profile", { user: req.userId });
});
/*app.get('/loggedin/:id', isLoggedIn, function(req, res){
        res.render("/profile/"+req.body.email); 
});
*/

app.get("/Users", function(req, res) {
  User.find().then(function(doc) {
    res.render("Users", { user: doc });
  });
});

//app.get("/Profil",isLoggedIn, function(req, res){
//if (req.session && req.session.username !== true) {
//  User.find()
//.then(function(doc) {
//res.render('Profil', {items: doc});
//    });
//    }
//        console.log( req.sessionID);
//});

/*app.post("/", passport.authenticate("local",{
successRedirect:"/Profil",
failureRedirect:"/"
})*/

Yes, that's right, I use multipart/form-data, because I want to upload and display an image. I tried it without uploading an image.It worked, but I don't how to implement uploading an image now.

<form action='/insert' method='post' enctype="multipart/form-data" class="inhalte-werden-zentriert">
    <!--Einleitung des Formulars-->

    <p>add profile picture:<br>
        <label for="file"></label>
        <input class="button" type="file" name="picture" accept="image/png, 
image/jpeg" />
    </p>
    <label for="username"></label>
    </br>
    <input type="text" name="username" placeholder="username" required autofocus="autofocus" pattern="[a-zA-Z]{2,}" id="username"><br>
    <label for="firstname"></label>
    </br>
    <input type="text" autofocus name="firstname" placeholder="firstname" pattern="[a-zA-Z]{2,}" id="firstname"><br>
    <!--Definition des einzeiligen Eingabefelds "Vorname" mit Platzhalter und 
Autofokus + verpflichtendes Feld-->

    <label for="name"></label>
    </br>
    <input type="text" name="name" placeholder="name" id="name" required pattern="[a-zA-Z]{2,}"><br>
    <!--Definition des einzeiligen Eingabefelds "Nachname" mit Platzhalter + 
verpflichtendes Feld-->

    <label for="city"></label>
    </br>
    <input type="text" name="city" placeholder="city" id="city" required pattern="[a-zA-Z]{2,}"><br>
    <!--Definition des einzeiligen Eingabefelds "Wohnort" mit Platzhalter-->

    <label for="birthday"></label>
    </br>
    <input type="date" name="birthday" id="birthday" placeholder="TT.MM.JJJJ" required><br>

    <label for="phonenumber"></label>
    </br>
    <input type="tel" pattern="[0-9]{1,}" name="phonenumber" id="phonenumber" placeholder="phonenumber"><br>
    <!--Definition des einzeiligen Eingabefelds "Telefonnummer" mit Platzhalter 
und Zahlen im Bereich von 0-9-->

    <label for="email"></label>
    </br>
    <input type="email" name="email" id="email" placeholder="email" required>
    <br>
    <!--Definition des einzeiligen Eingabefelds "eMail" mit Platzhalter + 
verpflichtendes Feld-->

    <label for="password"></label>
    </br>
    <input type="password" id="password" name="password" placeholder="password" required><br>
    <label for="aboutme"></label>
    </br>
    <textarea name="aboutme" id="aboutme" rows="6" cols="30" placeholder="aboutme" required></textarea><br>
    <!--Textbereich mit 6 Reihen und 30 Spalten + Platzhalter-->
    <input class="abschicken" type="submit" value="Save" />
    <!--einzeiliges Eingabefeld "Abschicken"-->
</form>
Matt Pengelly
  • 1,480
  • 2
  • 20
  • 34
Daniel
  • 9
  • 2
  • the request "body" isn't available. can you post your server code. ie: middlewares etc? – Matt Pengelly Jul 01 '19 at 21:34
  • I don't thint that the body is empty cause when I try console.log(req.body); after the data is saved then it shows the saved data. – Daniel Jul 02 '19 at 06:36
  • Please don't post code in comments, you can [edit] your question, append your code and format it properly – barbsan Jul 02 '19 at 08:15
  • The problem is very likely that you're not sending the data over to the server correctly, chances are youre using `type: 'multipart/form-data' when you send the data (because youve got midddleware for uploads in place). so the way you're used to sending data with the body is likely different. let me see if i can find an example. – Matt Pengelly Jul 02 '19 at 11:55
  • could you post the front end code that you use with this too? – Matt Pengelly Jul 02 '19 at 11:59
  • If I do it without uploading an image the error still occurs – Daniel Jul 02 '19 at 12:46
  • I havent been able to figure out the issue yet, try checking out this post though: https://stackoverflow.com/questions/39589022/node-js-multer-and-req-body-empty – Matt Pengelly Jul 02 '19 at 13:55

0 Answers0