我正在try 创建一个注册表单,使用node.js将Reaction连接到后端.它运行得很好,但现在我面临的问题是

将标头发送到客户端后无法设置标头

当用户名正确时(即),实现了Results.Long==0,而不是插入数据,它会给出错误.当我判断它时:

R.js:154未捕获(promise 中)AxiosError:{消息:‘网络错误’,名称:‘AxiosError’,代码:‘ERR_NETWORK’,配置:{…},请求:XMLHttpRequest,…} P

 const cors=require("cors");
    const { response } = require("express");
    const express = require("express");
    const app = express();
    const mysql=require("mysql");


    app.use(cors());
    app.use(express.json());
    const db=mysql.createConnection({
        host: "localhost",
        user: "root",
        password:"password",
        database:"ggsklogin",
    });

app.post("/checkusersk",(req,res)=>{
        const username=req.body.username;
        const password=req.body.password;
    db.query("select username from skcred where username=?;",[username],
    (err,results)=>{
        res.send(results);
        if(err){
            res.send({err});
        }
         if(results.length>0){
            res.send({message:"username exists"});
        }
        if(results.length==0){   
            res.send({message:"done"});
            db.query("insert into skcred(username,password) values(?,?)",[username,password],
            );

        }   
    });
    });

我的前端代码:

import React, { Fragment } from 'react';
import { useState,useEffect} from 'react';
import axios from 'axios';
import ReactSearchBox from "react-search-box";
import { connect } from 'react-redux';
import { key } from 'localforage';
import { Alert } from 'bootstrap';
import { useNavigate } from 'react-router-dom';

function Newlogin() {
    const navigate=useNavigate()
    const[usernamea,setusername]=useState('')
    const[passworda,setpassword]=useState('')
    const[repeatpass,setreapeatpass]=useState('')
    const[loginstatus,setLoginstatus]=useState('')
    const check=()=>{
       
    axios.post('http://localhost:3001/checkusersk', {
            
           username: usernamea,
           password: passworda,
        }).then((response)=>{
            
        if(response.data){
            console.log(response.data)
            setLoginstatus(response.data.message); 
            
         } 
        if(response.data=0) {
            navigate('/sk-details') 

         } 
        })
        
        }
        
    if(loginstatus=='done'){
            navigate('/sk-details') 
             }  
    const passwordcheck=(e)=>{
        if(passworda!=repeatpass){
            setLoginstatus("password mismatch")
        }
       
            check()
        }
    
     
    return ( 
        <div>
        <div>
            <input type="text" placeholder='enter username' name='username' onChange={(e)=>{setusername(e.target.value)}}/>
            <br/>
            <br/>
            <input type="password" placeholder='enter password' name='password' onChange={(e)=>{setpassword(e.target.value)}}/>
            <br/>
            <br/>
            <input text="password" placeholder='repeat password' name='repeatpass' onChange={(e)=>{setreapeatpass(e.target.value)}}/>
            <br/>
            <br/>
    
            <button onClick={passwordcheck}></button>
        </div>

        <div class="alert alert-info" role="alert">
             {loginstatus}
        
        </div>
        
      
        </div>
     );
    }  

export default Newlogin;

我也在期待你们的另一种解决方案.也就是说,在前端,如果用户名唯一且密码匹配,则应该重定向到"/SK-Detailures".请也为我提供一个解决方案.

在第一种情况下,我试图显示结果,但它给出了不可否认的错误. 在第二种情况下,当用户名和密码都正常时,它不会被重定向!

推荐答案

错误在第res.send(results);行,您正在发送此响应,当您所说的results.length==0为真时,它试图发送另一个响应res.send({message:"done"}),该响应将失败,因为您不能从单个端点发送.send个多个响应.如果您需要发送results,则需要为其添加另一个条件逻辑,但如果您不打算发送它,则将其删除:

const cors=require("cors");
const { response } = require("express");
const express = require("express");
const app = express();
const mysql=require("mysql");


app.use(cors());
app.use(express.json());
const db=mysql.createConnection({
    host: "localhost",
    user: "root",
    password:"password",
    database:"ggsklogin",
});

app.post("/checkusersk",(req,res)=>{
    const username=req.body.username;
    const password=req.body.password;
db.query("select username from skcred where username=?;",[username],
(err,results)=>{
    // res.send(results); // this is removed so that below conditions can send response
    if(err){
        res.send({err});
    }
     if(results.length>0){
        res.send({message:"username exists"});
    }
    if(results.length==0){   
        res.send({message:"done"});
        db.query("insert into skcred(username,password) values(?,?)",[username,password],
        );

    }   
});
});

而且与后端错误无关,前端的Axios设置为失败,您正在赋值为if(response.data=0) {行,而不是使用比较=运算符,但即使这样,您也会将一个对象与始终为false0进行比较,相反,您需要判断response.data === 'done'是否可以修复它:

// ...
const check=()=>{
       
    axios.post('http://localhost:3001/checkusersk', {
            
           username: usernamea,
           password: passworda,
        }).then((response)=>{
            
        if(response.data){
            console.log(response.data)
            setLoginstatus(response.data.message); 
            
         } 
        // if(response.data=0) { // This would always be false
        // Use this instead:
        if (response.data === 'done') {
            navigate('/sk-details') 

         } 
        })
        
        }
// ...

Mysql相关问答推荐

使用由其中一个表的列规定的条件连接两个表

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

LaravelEloquent ToSql()缺少连接表

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

为什么MySQL不同版本的值会变化?

SQL:如何 Select 每个客户最后购买的产品?

如何解码存储在带有type*:前缀的base64中的数据?

Mysql,显示谁已经和没有 Select 退出巴士服务

MySQL如何在小时和分钟之间 Select 时间

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

MySQL 中的 LATERAL 语法 - 是否只是说左表首先执行以便下一个可以引用它?

如何使用同一个表在 2 个字段上左连接

基于 3 个条件 Select 3 行的最佳 MySQL 索引和查询

MySQL - 考虑到所有前几天,每天计算唯一用户

如何通过未知列中的唯一值有效地更新 MySQL 行

MySQL解释计划中 Select 优化的表的含义

在mysql中复制没有数据的数据库 struct (带有空表)

MySQL:唯一字段需要是索引吗?

如何允许 django 管理员将字段设置为 NULL?