ошибка: SequelizeValidationError: нарушение строки: созданный не может быть массивом или объектом - PullRequest
0 голосов
/ 16 мая 2019

Я внедряю MERN Stack Login / Registration и пытаюсь пошагово проверить свой ответ в Postman.Сначала я написал код для регистрации, затем для входа в систему, но в случае звонка по ссылке для регистрации я получаю следующую ошибку в почтальоне:

error: SequelizeValidationError: string violation: created cannot be an array or an object

Может ли кто-нибудь предложить какие-либо предложения, чтобы помочь?Я думаю, что в User.js findone() функция имеет какой-то промах с моей стороны.

Может ли быть другое решение?

. / Database / DB.js

const db = {}
const sequelize = new Sequelize("mern", "root", "", {
        host: "localhost",
        dialect: "mysql",
        port: "3307",
        operatorsAliases: false,

        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
})

db.sequelize = sequelize
db.sequelize = sequelize

module.exports = db

. / Models / User.js

const db = require("../database/db")

module.exports = db.sequelize.define(
    'user',
    {
        id: {
             type: Sequelize.INTEGER,
             primaryKey: true,
             autoIncrement: true
        },
        first_name: {
            type: Sequelize.STRING
        },
        last_name: {
            type: Sequelize.STRING
        },
        email: {
            type: Sequelize.STRING
        },
        password: {
            type: Sequelize.STRING
        },
        created: {
            type: Sequelize.STRING
        }
    },
    {
        timestamps: false
    }
);

. / route / User.js

const users = express.Router()
const cors = require('cors')
const jwt = require("jsonwebtoken")
const bcrypt = require('bcrypt')

const User = require("../models/User")
users.use(cors())

process.env.SECRET_KEY = 'secret'

users.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({
        where: {
            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)
        })
})

users.post('/login', (req, res) => {
    User.findOne({
        where: {
            email: req.body.email
        }
    })
    .then(user => {
        if(user) {
            if(bcrypt.compareSync(req.body.password, user.password)) {
                let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
                    expiresin: 1440
                })
                res.send(token)
            }
        } else {
            res.status(400).json({error: 'User does not exist'})
        }
    })
    .catch(err => {
        res.status(400).json({ error: err})
    })
})

module.exports = users

package.json

  "name": "login-registration",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "nodemon server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcrypt": "^3.0.6",
    "bcryptjs": "^2.4.3",
    "body-parser": "^1.17.2",
    "cors": "^2.8.4",
    "express": "^4.16.3",
    "jsonwebtoken": "^7.4.2",
    "mysql": "^2.14.1",
    "mysql2": "^1.6.1",
    "nodemon": "^1.18.3",
    "sequelize": "^4.38.0"
  }
}

Server.js

var cors = require ('cors')
var bodyParser = require("body-parser")
var app = express()
var port = process.env.PORT || 5000

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

var Users = require('./routes/users')

app.use('/users', Users)

app.listen(port, () => {
    console.log("Server is running at port: " + port)
})

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

В ./routes/User.js, в / post регистре, объект userData имеет созданное поле со свойством today, которое является объектом Date.

В ./models/User.js вы указываете, что созданный должен иметь тип Sequelize.STRING.

Это противоречие вызывает ошибку. Когда вы вызываете User.create (userData), он выдает эту ошибку, потому что входной параметр имеет неправильный тип.

Чтобы исправить это, вам нужно либо создать ожидаемый тип Sequlize.Date, либо преобразовать объект даты сегодня в строку.

const today =  new Date().toJSON();

Существует много различных строковых функций для класса Date. Вы должны выбрать тот, который лучше всего подходит вам здесь

0 голосов
/ 16 мая 2019

Решение Dhaval помогло мне. :) Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...