我有这段代码,做所有的登录和注册在我的网站上的东西。我最初是在另一个文件夹中开发的,那里一切正常,但是在导入到我的主站点之后,它就停止工作了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="POST" action="/register-new" style = "display:flex; flex-direction: column; align-items:center; justify-content: center; height:100vh">
<input name = "username" placeholder = "username" type="text" required>
<input name = "password" placeholder = "password" type="text" required>
<button type = "submit"> Submit</button>
</form>
</body>
</html>Express.js代码
var express = require('express');
let router = express.Router();
let userForm = require("./postAccount")
const mongoose = require("mongoose");
let session = require('express-session');
var Sequelize = require('sequelize');
const bcrypt = require('bcrypt');
router.use(express.json());
function checkUniqueRegister(data,res,req){
let promise = new Promise((suc, fai)=>{
userForm.findOne({ username : data.username }, function (err, user) {
if(user === null){
userForm.create(data)
res.redirect("/account/accountpage")
suc()
}else{
res.redirect("/fail")
fai()
}
});
})
return promise
}
function checkUniqueLogin(data, res){
let promise = new Promise((suc, fai)=>{
userForm.findOne({ username : data.username}, function (err, user) {
if(user === null){
res.redirect("/fail")
fai()
}else{
if (bcrypt.compareSync(data.password,user.passwordHash)){
res.redirect("/account/accountpage")
suc()
}
}
});
})
return promise
}
router.get('/register',function(req,res){
res.render('../view/register',{errors: ""});
});
router.get('/login',function(req,res){
res.render('../view/login',{errors: ""});
});
router.get('/account/accountpage',function(req,res){
const user = req.session.username
res.render('accountpage',{username: user});
});
router.post('/register-new', async (req,res) => {
const passwordHash = bcrypt.hashSync(req.body.password,10);
const {username, password} = req.body
checkUniqueRegister({username,password,passwordHash},res,req).then(()=>{let newSession = req.session;newSession.username = username;req.session.save();}, ()=>{console.log("fail")})
})
router.post('/login-user', async (req,res) => {
const passwordHash = bcrypt.hashSync(req.body.password,10);
const {username,password} = req.body
checkUniqueLogin({username, password, passwordHash},res).then(()=>{let newSession = req.session;newSession.username = username;req.session.save();}, ()=>{console.log("fail")})
})
router.get("/all-items/delete", async (req,res)=>{
await userForm.deleteMany()
res.json({"message": "all data has been deleted"})
})
module.exports = router错误码
C:\xampp\htdocs\node_modules\bcrypt\bcrypt.js:91
throw new Error('data and salt arguments required');
^
Error: data and salt arguments required
at Object.hashSync (C:\xampp\htdocs\node_modules\bcrypt\bcrypt.js:91:15)
at C:\xampp\htdocs\serverSide\routerAccount.js:58:33
at Layer.handle [as handle_request] (C:\xampp\htdocs\node_modules\express\lib\router\layer.js:95:5)
at next (C:\xampp\htdocs\node_modules\express\lib\router\route.js:144:13)
at Route.dispatch (C:\xampp\htdocs\node_modules\express\lib\router\route.js:114:3)
at Layer.handle [as handle_request] (C:\xampp\htdocs\node_modules\express\lib\router\layer.js:95:5)
at C:\xampp\htdocs\node_modules\express\lib\router\index.js:284:15
at Function.process_params (C:\xampp\htdocs\node_modules\express\lib\router\index.js:346:12)
at next (C:\xampp\htdocs\node_modules\express\lib\router\index.js:280:10)
at jsonParser (C:\xampp\htdocs\node_modules\body-parser\lib\types\json.js:119:7)此外,req.body()返回{},我相信路径可能有一些问题,但我看不到它们,我的应用程序崩溃的代码行也是这样的,尽管在导入所有代码之前它工作得很好。bcrypt.compareSync(data.password,user.passwordHash)。整件事都来自于空的req.body()
发布于 2022-07-05 11:58:38
你需要添加
router.use(express.urlencoded({ extended: true }));在router.use(express.json());之后
您可以在官方文档中了解更多关于这个函数的信息,就在这里,http://expressjs.com/en/api.html#express.urlencoded。
你为什么要这么做?
基本上,当您使用action="POST"通过表单发送请求时,它会发送带有header Content-Type: application/x-www-form-urlencoded的请求。
由于express.json()处理Content-Type: application/json主体,express.urlencoded() one处理application/x-www-form-urlencoded主体。
发布于 2022-07-05 12:01:20
错误来自于bcrypt.hashSync方法。在您的例子中,您有以下代码:
const passwordHash = bcrypt.hashSync(req.body.password,10);我认为您的问题来自必须为空(null或未定义)的req.body.password。错误表示数据和salt参数是必需的。看起来您的salt是正确生成的,并且您没有检查req.body.password ===是否未定义,不知何故req.body.password是未定义的。
https://stackoverflow.com/questions/72868802
复制相似问题