Как мне создать маршрут регистрации в express. js? - PullRequest
1 голос
/ 08 апреля 2020

Я создаю REST API и могу подключиться к серверу и базе данных. Проблема в том, что когда я пытаюсь добавить пользователя в базу данных в Postman, он сохраняет пользователя в базе данных, но пользователь не определен. Я получаю пустой объект в моем MongoDB.

Пример результата:

_id:ObjectId("5e8e108487d47c2d87872f20")
                   date:2020-04-08T17:43:29.445+00:00
                  __v:0

Модель

    const mongoose = require('mongoose');

    const userSchema = mongoose.Schema({
        first_name: {type: String, require: true},
        last_name: {type: String, require: true},
        email: {type: String, require: true},
        password: {type: String, require: true},
        date: {type: Date, default: Date.now()}  
    });

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

Маршруты

    const router = require('express').Router();
    const jwt = require('jsonwebtoken');
    const bcrypt = require('bcrypt');

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

    router.post('/register', (req, res) => {
        const today = new Date();
        const userData = {
            first_name: req.body.first_name,
            last_name: req.body.last_name,
            email: req.body.email,
            password: req.body.password,
            created: today
        }

        User.findOne({
            email: req.body.email
        })
        .then(user => {
            if(!user){
                bcrypt.hash(req.body.password, 10, (err, hash) => {
                    userData.password = hash
                    User.create(userData)
                    .then(user => {
                        res.json({status: user.email + ' registered!'})
                    })
                    .catch(err => {
                        res.send('error: ' + err)
                    })
                })
            } else {
                res.json({error: ' user already exists'})
            }
        })
        .catch(err => {
            res.send('error: ' + err)
        })
    })

    module.exports = router;

Сервер

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 5000;
const URI = process.env.MONGO_URI;

// parse requests
app.use(express.json());
app.use(cors());

// Connecting to DB
mongoose.connect(URI, { useNewUrlParser: true, useCreateIndex: true});
const connection = mongoose.connection;
connection.once('open', () => {
    console.log('MongoDB database connection established successfully');
})

const usersRouter = require('./api/routes/users');

app.use('/users', usersRouter);

app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Попробуйте следующее:

Модель:

const mongoose = require('mongoose');
const userSchema = mongoose.Schema({
        first_name: {type: String, required: true},
        last_name: {type: String, required: true},
        email: {type: String, required: true},
        password: {type: String, required: true},
        date: {type: Date, default: Date.now()}  
});

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

Маршруты

const router = require('express').Router();
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');

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

router.post('/register', (req, res) => {
  const today = new Date();
  const userData = {
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email: req.body.email,
    password: req.body.password,
    created: today
  }

  User.findOne({
    email: req.body.email
  })
    .then(user => {
      if (!user) {
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          userData.password = hash
          const newUser = new User(userData);
          newUser.save()
            .then(user => {
              res.json({ status: user.email + ' registered!' })
            })
            .catch(err => {
              res.send('error: ' + err)
            })
        })
      } else {
        res.json({ error: ' user already exists' })
      }
    })
    .catch(err => {
      res.send('error: ' + err)
    })
})

module.exports = router;

В модели я использовал required вместо require и для добавления новый пользователь, я создал новый объект модели и затем использовал метод .save().

1 голос
/ 08 апреля 2020

Как я понимаю, в коде есть одна проблема

const userSchema = mongoose.Schema({
    first_name: {type: String, require: true},
    last_name: {type: String, require: true},
    email: {type: String, require: true},
    password: {type: String, require: true},
    date: {type: Date, default: Date.now()}  
});

Это свойство даты, но на самом деле вы используете created в вызове API. Вы должны использовать точное название модели (рекомендуется) или попробовать strict: false свойство.

0 голосов
/ 09 апреля 2020

В вашей модели, просто замените ключ «дата» вместо «создан». Кроме того, чтобы требовать ключ, вы должны написать required:true вместо require:true. Вот код модели, который должен работать:

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
    first_name: {type: String, required: true},
    last_name: {type: String, required: true},
    email: {type: String, required: true},
    password: {type: String, required: true},
    created: {type: Date, default: Date.now()}  
});

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