【问题标题】:Redirect after POST request to another HTML documentPOST 请求后重定向到另一个 HTML 文档
【发布时间】:2021-01-06 13:45:12
【问题描述】:

我有一个问题。我正在研究大学项目的登录 API。所以这就是事情。 我有一个表单,用户输入他的电子邮件和密码,我想要的是:如果答案是正确的,即状态 200,它会将我重定向到项目内的另一个 HTML 文档,在这种情况下称为“ home.html”。 因此,我从客户端检查了响应是否正确,并且数据传输成功,但是尽管我阅读了几篇帖子,但我无法给出解决方案。我将附上 HTML 代码、JS(前端)(我使用的是 Vainilla JS)、NodeJS 和 Express 的服务器以及 POST 请求的代码。

HTML 表单

        <form action="/user/login" method="POST" id="form"> 
        <div class="form-group">
          <label for="email" class="etiqueta">E-Mail</label>
          <input type="emai" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Ingresa tu Email" required>
        </div>
        <div class="form-group">
          <label for="password" class="etiqueta">Contraseña</label>
          <input type="password" class="form-control" id="password" placeholder="Contraseña" required>
        </div>
        <br>
        <button type="submit" id="boton-inicia" class="btn btn-primary">Inicia Sesion</button>
      </form>

JS 前端

    // Funcion de envio
iniciaSesion = (e) => {
    e.preventDefault();

    // Declaro la constante
    const host = 'http://localhost:3000/user/login';

    // Declaro una constante que va a obtener los valores de los inputs
    const form = {
        email: document.getElementById("email").value,
        password: document.getElementById("password").value
    };

    if (form.email === '', form.password === ''){
        UI.mostrarAlerta('Por favor, ingrese todos los datos', 'danger');
    } else { 
        // Declaro su end-point, metodo + envio en JSON
        fetch(host, {
        method: 'POST',
        body: JSON.stringify(form),
        headers: {
            'Content-type': 'application/json'
        }
        }).then((response) => {
            // console.log(response);
            return response.text();
        }).then((info) => {
            const json = JSON.parse(info)
            // console.log(json);
        }).catch((error) => {
            console.error(error);
        })
    }
};

// Llamo al boton y le agrego su evento y defino la funcion
document.getElementById("boton-inicia").addEventListener('click', iniciaSesion);

节点/Express 服务器

// Modulos requeridos
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const connectWithMongo = require("./config/db"); // Llamo a la configuracion de conexion a la DB
const user = require("./routes/user"); // Llamo al modelo de usuarios

// Inicios
connectWithMongo();
const app = express();
const publicDirectory = path.join(__dirname, "../public/");

// Declaro puerto para el servidor 
const PORT = process.env.PORT || 3000; 

//Middleware
app.use(express.static(publicDirectory));
app.use(bodyParser.json());
app.use(express.urlencoded({extended: true}));
app.use(express.json());

// Con esta peticion, chequeo que la API este funcionando
app.get("/", (req,res) => {
    res.json({
        message: "Api Running"
    });
});

app.use("/user", user);

app.listen(PORT, (req,res) => {
    console.log(`Server iniciado en puerto ${PORT}`);
});

POST 方法

router.post("/login", [
    // Le indico los inputs a chequear
     check("email", "Por favor, ingrese un email").isEmail(),
     check("password", "Por favor, ingrese una contraseña").isLength({min: 6})
 ], async (req, res) => {
    // Requiero la data
    const { email, password } = req.body;

    try {
        // Declaro en una variable que busque a un usuario por email si existe
        let user = await User.findOne({
            email
        });

        // Declaro que, si el email es distinto, devuelva un mensaje
        if (!user)
        return res.status(401).json ({
            message: "Usuario no existe"
        });

        // Constante que va a comparar email con contraseña
        const esIgual = await bcrypt.compare(password, user.password);

        // Declaro que, si el email es distinto, devuelva un mensaje
        if (!esIgual)
        return res.status(401).json({
            message: "Contraseña no coincide"
        });

        const payload = {
            user: {
                id: user.id
            }
        };

        jwt.sign(payload,"randomString", {
            expiresIn: 10000
        }, (err, token) => {
                if (err) throw err;
                res.status(200).json({
                    token
                });
            }
        );
    } catch (e) {
        console.log(e);
        res.status(500).json({
            message: "Error de servidor"
        });
    }
 });

谢谢大家!

PD:我从浏览器的控制台附加了一个标题,您可以在其中看到,我有来自身份验证的令牌和响应的状态。 Click here to see it !

【问题讨论】:

    标签: javascript node.js api express authentication


    【解决方案1】:

    由于您是通过 JavaScript 提交表单,因此您可以在成功调用后使用window.location.replace()

    fetch(host, {
      method: 'POST',
      body: JSON.stringify(form), 
      headers: { 'Content-type': 'application/json' }
    }).then((response) => {
      // console.log(response);
      return response.text();
    }).then((info) => {
      const json = JSON.parse(info)
       window.location.replace("/home.html"); // <= HERE
      // console.log(json);
    }).catch((error) => {
      console.error(error);
    })
    

    另外,您可以直接阅读json 的回复,而无需执行text()JSON.parse

    fetch(host, {
      method: 'POST',
      body: JSON.stringify(form),
      headers: { 'Content-type': 'application/json' }
    })
    .then(response => response.json())
    .then(json => {
       // do stuff with `json` body
       window.location.replace("/home.html"); // <= HERE
    })
    .catch(console.error)
    

    【讨论】:

    • 你好山姆!感谢您的回答,该方法有效,但由于某种原因它不执行验证。例如,我输入的电子邮件和密码与注册的不同,它无论如何都会重定向我,这不应该发生
    • @FedeBerbara,所以bcrypt.compare(password, user.password); 总是返回true,即使您使用不同的密码?
    • 我知道,听起来很奇怪吧? bcrypt.compare(password, user.password); 如果工作,因为我在浏览器和 Postman 中进行了测试,如果输入不同的密码,我会收到消息:密码不正确。我仍在与这个问题作斗争:'(
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 2017-05-07
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多