【问题标题】:ExpressJS - Won't post new user to MongoDB (500 Internal Server Error)ExpressJS - 不会将新用户发布到 MongoDB(500 内部服务器错误)
【发布时间】:2019-07-16 17:57:05
【问题描述】:

我正在创建一个 MEAN Stack 应用程序并尝试创建一个新用户以添加到我的 MongoDB。在 Postman 上测试此功能,我不断收到 500 Internal Server Error。在 user-contoller.js 中创建 newUser 后,我 console.log 但显示的只是 {_id: 5c700e93cb5c320d18bc285}。

app.js

//

Dependency or module imports
    const path = require('path');
    const express = require('express');
    const bodyParser = require('body-parser');
    const mongoose = require('mongoose');
    const cors = require('cors');
    const helmet = require('helmet');
    const passport = require('passport');

    //Used to use enviroment variables to connect to DB
    require('dotenv').config();
    const dbconfig = require('./config/database');

    //Use this for now - have to change for development and production testing
    var url ="mongodb://localhost:27017/DB-Dev" || 3000;

    //Connecting to MongoDB - locally, development, testing, and production -- Changing dbconfig files
    mongoose.Promise = global.Promise;
    mongoose.connect(url, { 
      useCreateIndex: true,
      useNewUrlParser: true 
    });

    // On database connection
    mongoose.connection.on('connected', () => {
      
      console.log('Connected to database');
      
    });

    // If database connection errors
    mongoose.connection.on('error', (err) => {
      console.log('Database error: ' + err);
      //winston.error('Failed to connect to database)
    })

    //Create express application
    const app = express();


    //Use helmet to set some http security headers
    app.use(helmet());

    // Imports for routing classes
    const userRoutes = require('./routes/user-routes');

    //Port for server to listen on - may change in the future
    const port = 3000;

    //CORS default allows request from anywhere - set origins or routes
    app.use(cors());

    //set static folder for client side files
    app.use(express.static(path.join(__dirname, '../public')));

    //Body parser middleware
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());


     app.use((req, res, next) => {
       res.setHeader("Access-Control-Allow-Origin", "*");
       res.setHeader(
         "Access-Control-Allow-Headers",
         "Origin, X-Requested-With, Content-Type, Accept, Authorization"
       );
       res.setHeader(
         "Access-Control-Allow-Methods",
         "GET, POST, PATCH, PUT, DELETE, OPTIONS"
       );
       next();
    });

    //Passport middleware
    // app.use(passport.initialize());
    // app.use(passport.session());
    // //Import passport config file
    // require('./config/passport')(passport);

    //Default all routes to the homepage
     app.get('*',(req,res) => {
       res.render(path.join(__dirname, '../angular-src/src/index.html'));
    });

    //Route handling done here
    app.use('/users',helmet.noCache(), userRoutes);


    //If there is an error, returns a 500 error
    app.use((err, req, res, next) => {
      if(err) {
        return res.sendStatus(500);
      }
      next();
    });



    //Start Server
    app.listen(port, () => {
      console.log("Server started on: " + port);
    }).setTimeout = 300000; //Timeout after 5 minutes

user-model.js

// Import modules and configuration files
const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');


// User schema
const userSchema = mongoose.Schema({
    firstName: {
        type: String, 
        required: true,
    },
    lastName: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type:String,
        required: true,
    },
});

//Using this will check for duplicate database entries 
userSchema.plugin(uniqueValidator);

module.exports = mongoose.model("User", userSchema);

user-controller.js

//Import dependencies here needed to complete middleware implementation
const crypto = require('crypto');
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const validationResult = require("express-validator");

const User = require('../models/user-model');


exports.createUser = (req, res, next) => {
    bcrypt.hash(req.body.password, 10).then(hash => {
      const newUser = new User({
        firstName: req.body.firstName,
        lastname: req.body.lastname,
        email: req.body.email,
        password: hash
      });

      newUser.save().then(result => {
        res.status(201).json({
          message: "User has been created",
          result: result
        });
      })
      .catch(err => {
        res.status(500).json({
          message: "Invalid authentication credentials"
        });
      });
    });
} // End of createUser middleware 

user-routes.js

// Import dependencies 
const express = require('express');
const { check } = require('express-validator/check');


// Imported controller files
const UserController = require('../controller/user-controller');

// Create a new instance of Router
const router = express.Router();

// TO - DO 
//register route follows /users/register
//middle checks array is from express-validator library. checks strings to see if they meet requirements also sanitizes html with the .escape()
router.post("/register", 
   UserController.createUser
);

//TO-DO: Authenticate 

//TO-DO: Resend Verification Email

//TO-DO: Verify Account

//TO-Do: Get User Profile

module.exports = router;

【问题讨论】:

  • 当您向 Postman 发出请求时,能否包含您的 Express 服务器日志的输出?
  • 它显示的只是{"message" Invalid authentication credentials}

标签: javascript node.js mongodb express mongoose


【解决方案1】:

首先,我会在user-controller.js 中添加一些console.log 语句。

由于 firstName、lastName、email 和 password 是 User 模型的必需属性,因此在尝试创建和保存新用户记录之前,我会 console.log 它们。

console.log(`***firstName: ${req.body.firstName}`)
console.log(`***lastName: ${req.body.lastName}`)
// ...

使用 Postman 触发 HTTP 请求以访问适当的路由,然后查看 Express 服务器日志以查看数据是否从客户端(Postman)进入服务器上的这些变量。

如果没有,请在请求中设置它们。

Postman: Requests - Form Data

【讨论】:

  • 在保存新用户记录前添加console.log时,控制台输出{ _id: 5c701eee5188b21f6c3bea68 }然后抛出ValidationError。
  • 是的,因为用户没有保存。可能是因为缺少一项或多项必需的用户属性。 console.log(firstName)console.log(lastName) 等,以验证这些值是否存在。
  • 当我 console.log(firstName)console.log(lastName) 时,我只是在 Postman 上收到内部服务器错误。所以这些值没有保存
  • 啊,所以 Postman 给你的输出在添加 console.log 时不应该改变。您将需要查看在终端窗口中运行的服务器 (express) 的输出。在那里寻找数据。为了让它更明显,试试这个:console.log(`***firstName: ${firstName}`)
  • 非常感谢!
猜你喜欢
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多