Javascript Node.js-Can';t呈现/发送来自中间件的内容

Javascript Node.js-Can';t呈现/发送来自中间件的内容,javascript,jquery,express,post,middleware,Javascript,Jquery,Express,Post,Middleware,我在端口8082上运行一个express服务器。访问路由“/”as GET后,它呈现index.html文件,然后使用app.js脚本将其表单发送到“/”as POST。此路由有一个称为“validate1”的中间件,用于检查头“x-client”是否等于“student”,以便控制此路由访问 问题是,当标题“x-client”不等于“student”,并且“validate1”中间件最终位于“else”中时,我无法呈现或发送任何响应。node.js打印我的“here”,但它不运行下一行“res

我在端口8082上运行一个express服务器。访问路由“/”as GET后,它呈现index.html文件,然后使用app.js脚本将其表单发送到“/”as POST。此路由有一个称为“validate1”的中间件,用于检查头“x-client”是否等于“student”,以便控制此路由访问

问题是,当标题“x-client”不等于“student”,并且“validate1”中间件最终位于“else”中时,我无法呈现或发送任何响应。node.js打印我的“here”,但它不运行下一行“res.send()”

在“/travel”路径中,我使用了几乎相同的中间件,但我使用的是GET方法,而不是jquery

更新:由于“app.js”中jquery POST函数中的“.then()”,我发现我的响应正在我的浏览器控制台中打印,但即使删除它,响应也不会显示在页面上

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)
    })
})

文件
诺姆:

Sobrenome: 发送数据
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!")   
})
事实上,我没有收到任何错误,但是我收到的消息是我的表单按钮被禁用了,什么也没有发生


提前谢谢。

我不确定,但也许这篇文章期望json 所以试着发送

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

或者将内容类型标题设置为“text”

您正在进行
POST
HTTP调用,而您正在使用
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)
    })
})

我相信你的页面令人耳目一新?由于表单元素本身可能正在执行提交,您可以尝试在单击处理程序的顶部包含
event.preventDefault()
。这可以解释为什么服务器的else子句正在运行,但客户端看不到任何消息。

我刚刚尝试了res.send({msg:'some msg'}),但它保持不变,什么也没有发生。我也尝试过“res.json()”和“res.redirect()”,但它似乎被忽略了。标头系统工作正常,代码正确地结束在正确的“f”范围内,它甚至打印我的“here”console.log()。谢谢。我已经更新了我的问题,回答不会出现在它应该出现的地方,即主页上。它会出现在浏览器的控制台上。我将这行代码添加到我的代码中,它似乎没有发生任何更改。谢谢。无论如何,谢谢你感谢我!这似乎是一个令人头疼的问题…你看到浏览器的控制台窗口了吗?你看到了吗y消息正在那里打印。实际上,为了进行一些测试,我已更改为GET,我将更新我的问题,感谢您的观察。问题仍然存在,即使这条路线是POST路线。谢谢。是的,事实上我刚刚做了!它显示在浏览器的控制台上。这是因为“.then”“我想,但我想让它进入页面。我已经编辑了答案,请您尝试更改。现在,我的页面上显示了答案,就在表单下面。我的目标是在空白页中显示它,这将是“res.send()”效果,但它已经很有用了。非常感谢。