错误:SequelizeValidationError:字符串违规:创建的不能是数组或对象
Posted
技术标签:
【中文标题】错误:SequelizeValidationError:字符串违规:创建的不能是数组或对象【英文标题】:error: SequelizeValidationError: string violation: created cannot be an array or an object 【发布时间】:2019-10-04 00:27:25 【问题描述】:我正在实施 MERN 堆栈登录/注册,并尝试逐步测试我在 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
);
./routes/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"
服务器.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)
)
【问题讨论】:
你看到错误了吗,它本身就说明你创建的属性包含不同类型的数据,它应该是一个字符串而不是一个对象 谢谢您的回复先生。我可以理解,但我不知道它在代码中指向哪里。能具体说明一下吗? 将创建的属性字符串的数据类型更改为日期或使用类似today.toLocaleDateString()的值 它解决了这个错误。但现在我有 "status": "undefined registered" 现在已经解决了。第二个错误是由于输入错误而发生的。现在,它像奶油一样工作。非常感谢 Dhaval :)。 【参考方案1】:在 ./routes/User.js 中,在 /post 注册路由下,userData 对象有一个 created 字段,其中包含 today 属性,它是一个 Date 对象。
在 ./models/User.js 中,您指定 created 应具有 Sequelize.STRING 类型。
这是导致错误的矛盾。当你调用 User.create(userData) 时,它会给你这个错误,因为输入参数的类型错误。
要解决此问题,您要么需要创建预期类型的 Sequlize.Date,要么将今天的日期对象转换为字符串。
const today = new Date().toJSON();
Date 类有许多不同的字符串函数。你应该选择最适合你的here
【讨论】:
【参考方案2】:此错误是由于提交的值与 一个在模型中声明。因此,将其更改为适当的 类型是“JSON”而不是“STRING”。
./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.JSON
,
timestamps: false
);
【讨论】:
【参考方案3】:它是导致问题的“今天”属性,您正在尝试保存日期 obj 而不是字符串。保存时改成字符串。
【讨论】:
以上是关于错误:SequelizeValidationError:字符串违规:创建的不能是数组或对象的主要内容,如果未能解决你的问题,请参考以下文章