对于AJAX帖子和HTML表单帖子,是否有更简洁的方式来处理Express呈现?

时间:2014-04-12 06:04:43

标签: javascript jquery ajax json express

我有一个非常基本的HTML表单,我正在使用jQuery的AJAX post功能来获取一些信息,具体取决于数据库插入是成功还是失败。

我的代码目前正在执行以下操作,我只在通过AJAX发布时将ajax帖子变量设置为true以区分原点。

app.post("/mypath", function (req, res) {
    var post = req.body;

    if (post.ajax) {
        console.log(post.ajax, "posting as ajax");
    }

    if (post.ajax) {
        res.json({data: "Woah! You posted as ajax."});
    }
    else {
        // If posting via HTML form, send the user where they need to go
        res.redirect("someview");
    }
});

我真正担心的是,我不希望最终用户以纯文本格式查看带有JSON的页面,但是当我获得JavaScript支持时,我想要一些JSON数据,以便通知用户成功/失败。

有什么方法可以让我更干净吗?我有3个地方需要在一个申请路线中进行条件渲染。

我正在使用Express 3.x

2 个答案:

答案 0 :(得分:3)

不确定。只要您的客户端代码正确设置Accept标头,您就可以使用res.format,例如:

res.format({
    html: function() {
        res.redirect('someview');
    },
    json: function() {
        res.json({data: "You expected JSON? You got JSON!"});
    }
});

答案 1 :(得分:0)

看看this post我写了一会儿。我写了一个帮助器,它将自动在快递中呈现完整或部分视图。

关键是要创建这样的玉视图:(不幸的是,Jade视图是预编译的,你不能将变量传递给include,也不能有条件地调用extends,所以我们需要这个“胶水”文件。你会明白为什么。)

// home_full.jade

extends layout  
block content  
    include home

它扩展了布局文件并包含局部视图。此视图充当真实视图和布局文件之间的粘合剂。这些中间视图总是以“_full.jade”结尾。

接下来,我创建了自己的小中间件函数,将帮助器添加到req

app.use(function (req, res, next) {  
    res.renderView = function (viewName, viewModel) {
        res.render(viewName + req.xhr ? null : '_full', viewModel);
        next();
    };
});

它被称为renderView,它为我们提供了xhr逻辑。而不是使用req.render ...

呈现视图
res.render('home' + req.xhr ? null : '_full', viewModel);

...您只需致电req.renderView并传递视图名称:

res.renderView('home');

现在,如果请求是完整页面请求,那么我们将发回完全编译的视图,布局和所有。如果设置了ajax请求标头(大多数客户端库,如JQuery和其他人友好地为您做),那么我们将仅发回部分视图并让客户端填充页面上的相应区域:)

PS - 如果您需要将视图与其他JSON数据一起发回,您可以使用我的扩展版助手功能。例如:

res.renderView = function (viewName, viewModel) {
    if (!req.xhr) {
        res.render(viewName + '_full', viewModel);
    } else {
        res.render(viewName, viewModel, function (err, view) {
            if (err) return next(err);
            res.json({
                title: viewModel.title || "Untitled | CodeTunnel.com",
                bannerText: viewModel.bannerText || "CodeTunnel.com",
                view: view,
                url: req.url
            });
        });
    }
};

显然,你会根据自己的需要调整res.json来电。在上面的实现中,我需要一个JSON对象,其中包含页面标题,要在页面横幅中显示的文本,视图标记作为对象的字符串属性以及请求URL。然后我会在客户端上使用这些数据来渲染局部视图,以及更新页面标题和客户端上的其他内容。