使用ajax调用数据库操作后的节点呈现页面

时间:2019-07-07 21:36:23

标签: node.js ajax promise

我正在尝试在某些数据库操作完成后呈现页面。如果我进入控制台>网络>预览,它会显示我想要的内容,但不会显示在实际页面上。我在做什么错,仅仅是我正在使用ajax调用的事实吗?

router.get('/', function(req, res) {
    Promise.all([verifylogin(req.query.field1)])
        .then(
            data => {
                res.send(`<h1>something here</h1>`);


            }
        ).catch(
            // Log the rejection reason
            (reason) => {
                console.log('Handle rejected promise (' + reason + ') here.');
                res.redirect(303, '/thank-you');
            });


});

这是在前端调用服务器代码的内容:

$('#login').on("click", () => {
        var email = $('#email').val();
        var password = $('#password').val();
        $.get("/register", {
            field1: email,
            field2: password
        });
    });

我需要使用表格代替Ajax吗?

1 个答案:

答案 0 :(得分:0)

假设路由正确(/register而不是/),您得到的是<h1>something here</h1>响应,但没有在任何地方写(或没有显示在任何地方)。

$('#login').on("click", () => {
    var email = $('#email').val();
    var password = $('#password').val();
    $.get("/register", {
        field1: email,
        field2: password
    })
    .done(data => { 
        //write somewhere
        $('#someid').html(data);
    });
});

但是您也需要查看catch部分,它只是重定向到另一个页面。但是您正在做Ajax,因此它将返回重定向的页面内容。

编辑:
为什么重定向不起作用?

假设您要GET的路由,例如/route1,它返回一些html。另一条路由是/route2,内部路由到/route1

因此,如果您HTTP GET /route2,您认为输出将是什么?它是route1的内容。因为在内部它将重定向到/route1,所以从根本上说,它与获取/route1的内容相同。

我已经制作了一个POC供理解:

app.get('/:id', (req,res)=>{
    if(req.params.id === '2'){
        res.redirect('/3');
    }else{
        res.send(req.params.id || "products");
    }
});

为此路线

fetch('http://host/1').then((d)=>d.text()).then(console.log)  //returns 1
fetch('http://host/3').then((d)=>d.text()).then(console.log)  //returns 3

解决方法: 在您的catch块中,您可以返回url,在#login处理程序中,可以添加window.location.href = <theurl>以防出错。