问题描述
大家好!! 这里我有一个大问题,我想用 Node.js sequelize 和 MysqL 做一个注册。 我四处寻找,但我没有找到问题的答案,所以我来寻求帮助。 使用 mongoDb 会更容易,但我承认我在绕圈子。
这是我的代码:
// Importation :
// Bcrypt:
const bcrypt = require("bcrypt");
// Jsonwebtoken d'authentification:
const jwt = require("jsonwebtoken");
// Import du models user:
const models = require("../models/user")
//////////////////////////////////////////////////////////////////////////////////////////////
// Fonction/
// Incription:
exports.signup = (req,res) => {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
const bio = req.body.bio;
const admin = req.body.admin;
console.log(req.body)
try {
models.User.findOne({
attributes: ['email'],where: {
email: email
}
})
.then((userFound => {
if (!userFound) {
bcrypt.hash(password,10,function (err,bcryptPassword) {
const newUser = models.User.create({
username : username,email : email,password : bcryptPassword,bio : bio,admin : false
})
.then(newUser => {
res.status(201).json({
'userId': newUser.id
})
})
.catch(err => {
res.status(500).json({
'error': 'Impossible d\'ajouter un utilisateur'
})
})
})
} else {
return res.status(409).json({
error: 'Ce compte existe déjà '
})
}
})
.catch((err) =>
res.status(500).json({
'err': err + 'Impossible de vérifier l\'utilisateur',})
)
)
}catch (error) {
res.status(400).json({
error: error.message
});
}
}
和模型用户:
'use strict'
const { db } = require('../config/connexion')
const { Sequelize,DataTypes } = require('sequelize')
const user = db.define('User',{
// Model attributes are defined here
username: DataTypes.STRING,email: DataTypes.STRING,password: DataTypes.STRING,bio: DataTypes.TEXT,admin: DataTypes.BOOLEAN,})
module.exports = user
和 connexion.js:
// Connexion de sequelize à MysqL:
const {
Sequelize
} = require('sequelize')
const db = new Sequelize(
process.env.NAMEDB,process.env.USERDB,process.env.PASSWORDDB,{
host: process.env.HOSTDB,dialect: process.env.DIALECTDB,pool: {
min: 0,// nombre minimum de connexion dans le pool
max: 5,// nombre maximum de connexion dans le pool
acquire: 30000,// durée maximale,en millisecondes,pendant laquelle ce pool essaiera d'obtenir la connexion avant de lancer une erreur
idle: 10000,// temps maximum,pendant lequel une connexion peut être inactive avant d'être libérée
},}
)
//////////////////////////////////////////////////////////////////////////////////////////////
// Etablit la connexion à MysqL:
const dbConnect = async (db) => {
await db
.authenticate()
.then(() => {
db.sync()
console.log('Connecté à la base de données MysqL!')
})
.catch((err) => {
console.error('error: ' + err.message)
setTimeout(() => {
dbConnection(db)
},5000)
})
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Exportation:
module.exports = {
db,dbConnect,}
当然还有很多事情要做,但作为初学者,我会不断进步。
如果我的英文没有达到顶峰,请不要生我的气,我承认这不是我的强项。
预先感谢您提供的所有帮助。
解决方法
您直接将导出对象设置为等于用户对象。
执行此操作时 const models = require("../models/user")
,models
直接等于 user
值。
您可以直接使用 models.findOne
。阅读this
检查您的“模型”文件以查看其中是否存在“用户”模型。还要检查您是否正在使用“module.exports”
,您正在直接导出 User
模型,但像在名为 User
的对象属性中一样调用它。您可以直接访问它,更改:
models.User.findOne
到:
models.findOne
然后您可能想将 models
重命名为 User
。
或将您的导出更改为:
module.exports = { User: user };
,
您正在将 user
变量设置为文件的导出
module.exports = user
然后将 user
变量导入为 models
。
const models = require("../models/user")
这意味着您不需要将 user
作为属性访问。而是使用:
models.findOne({ // Changed from models.User to models
attributes: ["email"],where: {
email: email,},});
这应该会阻止您当前的错误,但您将继续收到错误,直到您将 models.User
的所有实例更改为 models
。
您的主文件最终应如下所示:
// Importation :
// Bcrypt:
const bcrypt = require("bcrypt");
// Jsonwebtoken d'authentification:
const jwt = require("jsonwebtoken");
// Import du models user:
const models = require("../models/user");
//////////////////////////////////////////////////////////////////////////////////////////////
// Fonction/
// Incription:
exports.signup = (req,res) => {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
const bio = req.body.bio;
const admin = req.body.admin;
console.log(req.body);
try {
models
.findOne({
attributes: ["email"],where: {
email: email,})
.then(
((userFound) => {
if (!userFound) {
bcrypt.hash(password,10,function (err,bcryptPassword) {
const newUser = models
.create({
username: username,email: email,password: bcryptPassword,bio: bio,admin: false,})
.then((newUser) => {
res.status(201).json({
userId: newUser.id,});
})
.catch((err) => {
res.status(500).json({
error: "Impossible d'ajouter un utilisateur",});
});
});
} else {
return res.status(409).json({
error: "Ce compte existe déjà ",});
}
}).catch((err) =>
res.status(500).json({
err: err + "Impossible de vérifier l'utilisateur",})
)
);
} catch (error) {
res.status(400).json({
error: error.message,});
}
};