#javascript #node.js #reactjs
#javascript #node.js #reactjs
Вопрос:
я создаю приложение для входа в систему с помощью reactjs и express js и sequilize, когда я тестирую его с помощью postman api, все работает, но когда я попробовал это с помощью reactjs, у меня возникла эта проблема в серверной части
Unhandled rejection Error: WHERE parameter "userName" has invalid "undefined" value
at MySQLQueryGenerator.whereItemQuery
вот мой компонент входа в react
import React, { Component } from 'react'
import'./login.css'
class Login extends Component {
constructor(props) {
super(props);
this.state = {
userName: '',
password : '',
}
}
handleChange = (e) => {
this.setState({ [e.target.name] : e.target.value});
}
handleSubmit = (e) => {
e.preventDefault();
fetch('http://localhost:4000/login',{
method: 'POST',
headers: {
'Accept': 'application/json,text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify({
userName: this.state.userName,
password: this.state.password,
}),
});
}
render() {
return (
<React.Fragment>
<div className="login-card">
<h1>Inventory Management App</h1>
<form onSubmit={this.handleSubmit}>
<input value={this.state.userName} onChange={this.handleChange} type="text" name="userName" placeholder="Username"/>
<input value={this.state.password} onChange={this.handleChange} type="password" name="password" placeholder="Password"/>
<input type="submit" name="login" className="login login-submit" value="login"/>
</form>
</div>
</React.Fragment>
)
}
}
export default Login
и вот код, который у меня есть на стороне серверной части
const express = require('express');
const User = express.Router();
const bcrypt = require('bcrypt');
const user = require('../Models/user');
function loginRouteHandler(req, res) {
user.findOne(
{
where: {
userName: req.body.userName,
},
},
)
.then((data) => {
if (bcrypt.compareSync(req.body.password, data.password)) {
req.session.userName = req.body.userName;
req.session.password = req.body.password;
console.log(req.session);
res.redirect('/');
} else {
res.send('user doesnt exists');
}
});
}
User.route('/login').post(loginRouteHandler);
module.exports = User;
и это модель
const db = require('../Db_connection/dbconnect');
const user = db.sequilize.define('user', {
id: {
type: db.Sequilize.INTEGER,
primaryKey: true,
},
userName: {
type: db.Sequilize.STRING,
primaryKey: true,
},
password: {
type: db.Sequilize.STRING,
primaryKey: true,
},
}, {
freezeTableName: true,
timestamps: false,
});
module.exports = user;
редактировать добавлено app.js
const express = require('express');
const session = require('express-session');
const cors = require('cors');
const app = express();
app.use(cors());
const bodyParser = require('body-parser');
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
}));
app.use(bodyParser.urlencoded({ extended: false }));
// parse application/x-www-form-urlencoded
const user = require('./Controller/User');
const port = 4000;
app.use('/', user);
app.listen(port);
я пробовал это также с axios api, но у меня не работает
Комментарии:
1. У вас есть
app.use(bodyParser.json())
?2. действительно, спасибо вам за то , что указали на это , я добавил это, и это сработало лучше , чем вы думаете !!!
Ответ №1:
У вас есть только app.use(bodyParser.urlencoded({ extended: false }));
но вы передаете свои параметры как json body: JSON.stringify({...})
. Попробуйте добавить app.use(bodyParser.json())
.
Проверьте документацию для получения более подробной информации: объект экспресс-запроса, body-parser