首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的帖子请求不发送内容?

为什么我的帖子请求不发送内容?
EN

Stack Overflow用户
提问于 2022-07-05 11:37:29
回答 2查看 30关注 0票数 0

我有这段代码,做所有的登录和注册在我的网站上的东西。我最初是在另一个文件夹中开发的,那里一切正常,但是在导入到我的主站点之后,它就停止工作了。

代码语言:javascript
运行
复制
<!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代码

代码语言:javascript
运行
复制
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

错误码

代码语言:javascript
运行
复制
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()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-05 11:58:38

你需要添加

代码语言:javascript
运行
复制
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主体。

票数 0
EN

Stack Overflow用户

发布于 2022-07-05 12:01:20

错误来自于bcrypt.hashSync方法。在您的例子中,您有以下代码:

代码语言:javascript
运行
复制
 const passwordHash = bcrypt.hashSync(req.body.password,10);

我认为您的问题来自必须为空(null或未定义)的req.body.password。错误表示数据和salt参数是必需的。看起来您的salt是正确生成的,并且您没有检查req.body.password ===是否未定义,不知何故req.body.password是未定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72868802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档