从控制器传递带有Nodejs的变量以查看不起作用

时间:2016-02-23 14:44:24

标签: json node.js express

我无法将var从控制器传递到带有Nodejs的视图。

目前,我使用快递,这是我的路线定义

var mongoose = require('mongoose');
var search = mongoose.model('products');

exports.findByName=function(req, res){
    var regex = new RegExp("^"+req.params.id, 'i');
    search.find(
        {'name': regex}, function(err, result) {
        if(err) return res.send(500, err.message);
        res.status(200).json(result);
    });
};

searchController有这段代码:

res.render('search', { test: 'test' });

使用mongoose正确连接到mongoDB。如果我在控制器中使用console.log(res),我会获得一个非常简洁的JSON文件(超过500行!),但是我无法在数据库中找到查询结果。

我从数据库中取出一个空数组,我已经与Postman核对了。这意味着问题不在数据库中:

enter image description here

拥有这么长的JSON文件是否正常?我知道我可以使用第二个参数将数据发送到视图我如何通过res.render('search', { 'test': 'test' });将控制器中的查询传递给视图,但是在视图中测试也是未知的,无论我是否也写{{1 }}

谢谢!

**更新**

感谢Mike的回答,我已将我的代码重构为以下内容:

**路线**

app.get('/search/:id', function(req,res){
    searchController.findByName(req, res);
});

**控制器**

exports.findByName=function(req, res){
    var regex = new RegExp("^"+req.params.id, 'i');
    search.find(
        {'name': regex}, function(err, result) {
        if(err) return res.send(500, err.message);
        console.log(result);  //--> NEW console.log inside controller, works
        res.render('search', {'result': result});
    });
};

现在结果是一个空数组(这是数据库中正确的值)但仍未在视图中呈现此变量。

**查看文件**

search.jade

include search.php

search.php

<script>
     var productsJSON = result;
</script>

**第二次更新**

感谢Mike的回答(再次),我正在取得一些进展。现在我的控制器是:

exports.findByName=function(req, res){
    var regex = new RegExp("^"+req.params.id, 'i');
    search.find(
        {'name': regex}, function(err, result) {
        if(err) return res.send(500, err.message);  
        res.render('search', {'pageData': {'result' : result}});
    });
};

我已将&#39; 添加到pageData,因为我认为必须在那里。

现在我的观点是:

search.jade

include header.php

script.
  var productsJSON = #{pageData.result}

但是没有用,我发现了以下错误:

enter image description here

我试图遵循in this page显示的一些技巧,但根本不起作用。

1 个答案:

答案 0 :(得分:1)

命中此端点时,您正在响应两次。您正在发送包含res.render('search', { test: 'test' });res.status(200).json(result);的回复。

尝试移动res.render('search', { test: 'test' });代替res.status(200).json(result);。然后,您将只有一次机会从此端点做出响应。

大型JSON响应对象是正确的。这就是响应对象的样子。它应该包含一些像上面例子中那样的东西。

要在Jade模板中显示您的数据,您需要使用this answer中所述的以下语法。

这样回答:
res.render('search', {pageData: {'result' : result}});

然后在你的模板中渲染如下的值:
#{pageData.result}

如果希望它们显示在模板中,您需要在#{}中包装从服务器端传递的任何变量。