Node.js - не может отрисовать / отправить что-либо из промежуточного программного обеспечения - PullRequest
0 голосов
/ 24 июня 2019

У меня есть экспресс-сервер runnnig на порту 8082. После доступа к маршруту "/" в GET он отображает файл index.html, затем я отправляю его форму в "/" как POST, используя скрипт app.js. Этот маршрут имеет промежуточное ПО под названием «validate1», которое проверяет, равен ли заголовок «x-client» «студенту», чтобы управлять этим доступом к маршруту.

Проблема в том, что когда заголовок «x-client» не равен «student», а промежуточное ПО «validate1» заканчивается в «else», я просто не могу вывести или отправить что-либо как ответ. Node.js печатает мое «здесь», но не запускает следующую строку «res.send ()».

На маршруте "/ travel" у меня почти то же самое промежуточное программное обеспечение работает отлично, но там я использую метод GET, а не jquery.

ОБНОВЛЕНИЕ: я выяснил, что мой ответ печатается в консоли браузера из-за моего ".then ()" в функции POST jquery в "app.js", но даже удаляя его, ответ никогда не отображается на странице .

index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge"><!-- rota no css-->
    <title>Document</title>

    <link rel="stylesheet" href="./style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

</head>
<body>
    <form method="POST">
        Nome:<input name="nome" type="text" id="nome">
        <br>
        Sobrenome:<input name="sobrenome" type="text" id="sobrenome">
        <button>Send data</button>
    </form>

</body>

<script src="./app.js"></script>
</html>

app.js

$("button").on("click", (event) => {
    $("button").attr("disabled","disabled")
    const nome = $("#nome").val().trim()
    const sobrenome = $("#sobrenome").val().trim()

    const user = {
        nome,
        sobrenome
    }

    $.ajax({
        url:"/",
        method:"POST",
        data:user,
        headers:{
            "x-client":"student",
            "x-class":500
        }
    }).then((resposta) => {
        console.log(resposta)
    }).catch((erro) => {
        console.log("Error:" + erro)
    })
})

routing.js

const express = require("express")
const path = require("path")entre windows e mac

const router = express.Router()

router.get("/",(req,res) => {
    res.sendFile(path.join(__dirname,"../views/index.html"))
})

//not working route
const validate1 = (req,res,next) => {
    const access = req.headers["x-client"]
    if(access === "student2"){
        next()
    }
    else{
        console.log("here")//it runs!
        res.send("You don't have access to it!")//it doesn't run!
    }
}

router.post("/", validate1 ,(req,res) => {
    const user = {
        nome:req.body.nome,
        sobrenome: req.body.sobrenome
    }

    res.json(user)
})

//working route

const validate2 = (req,res,next) => {
    const access = false
    if(access){
        next()
    }
    else{
        res.send("You don't have access to it!")  
    }
}

router.get("/travel",validate2,(req,res) => {
    res.send("Travel!")   
})

На самом деле я не получаю никакой ошибки, но вместо получения сообщения мне полагали, что моя кнопка формы просто отключается и ничего не происходит.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 24 июня 2019

Вы делаете HTTP-вызов POST, тогда как вы используете router.get в файле routing.js.

Можете ли вы изменить свой код на что-то вроде этого:

router.post("/", validate1 ,(req,res) => {
    const user = {
        nome:req.body.nome,
        sobrenome: req.body.sobrenome
    }

    res.json(user)
})

Внесите следующие изменения в app.js, чтобы отобразить сообщение об ответе в index.html

$("button").on("click", (event) => {
    $("button").attr("disabled","disabled")
    const nome = $("#nome").val().trim()
    const sobrenome = $("#sobrenome").val().trim()

    const user = {
        nome,
        sobrenome
    }

    $.ajax({
        url:"/",
        method:"POST",
        data:user,
        headers:{
            "x-client":"student",
            "x-class":500
        }
    }).then((resposta) => {
        console.log(resposta)
        $('body').append(resposta);
    }).catch((erro) => {
        console.log("Error:" + erro)
    })
})
0 голосов
/ 24 июня 2019

Мне кажется, ваша страница обновляется?Поскольку сам элемент формы может выполнять отправку, вы можете попытаться включить event.preventDefault() в верхней части вашего обработчика кликов.Это объясняет, почему выполняется условие else вашего сервера, но на стороне клиента не видно ни одного сообщения.

0 голосов
/ 24 июня 2019

Я не уверен, но, возможно, пост ожидают JSON поэтому попробуйте отправить

res.send({msg:'some msg'});

или установите заголовок типа контента на «текст»

...