NodeJS - 在res.render()

时间:2017-11-10 15:30:31

标签: node.js mongodb express

我使用MongoDB和NodeJS(使用Express Framework)。

我实际做了什么:

  • 在MongoDb中抓取一些数据
  • 渲染此数据。

我想做什么:

过滤特定项目。

过滤后的结果都是正确的,但我的问题是该页面会呈现两次。

我该如何防止这种情况?

我有一个主要的上下文,实际上看起来像这样:

app.get('/main', auth, function(req, res) {
    getItems(req, res, function(results) {
        renderResults(req, res, results);
    });
});

这是我的renderresult函数:

function renderResults(req, res, results) {

  console.log("In Rendermethode arrived:");
  console.log(results.items);

    res.render('pages/main', {
        offerings: results.items,
        ownUser: {
            id: req.session.user || ""
        },
        filterObj: {
            isActivated: typeof results.filterObj !== 'undefined',
            filterFor: typeof results.filterObj !== 'undefined' ? results.filterObj.filter : "",
            filterText: typeof results.filterObj !== 'undefined' ? results.filterObj.filterText : ""
        }
    });
}

我所做的是前端的帖子请求:

$("button.doSearch").on("click", function(e) {
    var dFilter = $("div.filterDropdown button").attr("value") || "",
        dFilterText = $("input.searchterm").val() || "";

    $.post("/search", {
            filter: dFilter,
            filterText: dFilterText
        },
        function(data, status) {
        });
});

这是搜索的后端片段:

app.post('/search', auth, function(req, res) {
    console.log("Filterrequest received.");
    getItems(req, res, function(results) {
        renderResults(req, res);
    });
});

1 个答案:

答案 0 :(得分:0)

我认为您要渲染相同的视图两次,因为您在两个请求get和post中调用renderResults函数

<强>问题:

您发出的第一个HTTP请求是对/main网址的GET请求,表示处理它并呈现pages/main视图

第二个请求是/search url的xhr帖子,express将处理它并呈现相同的视图pages/main(整个页面)

将整个页面呈现给您的AJAX对象没有任何意义,相反,您可以使用本机javascript或JQuery呈现JSON对象并更新页面

<强>解决方案:

根据请求类型呈现不同类型的数据(xhr OR 不是):

function renderResults(req, res, results) {

    var result = {
        offerings: results.items,
        ownUser: {
            id: req.session.user || ""
        },
        filterObj: {
            isActivated: typeof results.filterObj !== 'undefined',
            filterFor: typeof results.filterObj !== 'undefined' ? results.filterObj.filter : "",
            filterText: typeof results.filterObj !== 'undefined' ? results.filterObj.filterText : ""
        }
    };

    if (!req.xhr) {

        return res.render('pages/main', result);

    }

    res.json(result);
}