如何同时res.json和res.render,将mongo db传递给angularjs?

时间:2016-03-31 05:48:11

标签: angularjs node.js mongodb express

我使用express,它带有玉模板引擎。 的 app.js

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

对于每个模板,我需要res.render来呈现html标头,如果我不使用res.render,模板/页面将不会显示。的路由/ index.js

router.get('/', function(req, res, next) {
    res.render('index', { title: 'Bookshop' });
});

router.get('/data', function(req, res, next) {
    res.render('data', { title: 'Bookshop | Categories' });
});

router.get('/items', function(req, res, next) {
    res.render('items', { title: 'Bookshop | Items' });
});

app.js 我已正确设置MongoDB。

var mongojs = require('mongojs');
var db = mongojs('book', ['books']);

我要实现的是将MongoDB数据库传递给angular,然后在jade文件中循环。的 myscript.js

app.controller('appCtrl', function ($scope, $http) {
   $http.get('/data').then(function(res){
        console.log(res.data);
        $scope.books = res.data;
    });
});

data.jade 文件看起来像这样

p(ng-repeat="item in books")
    span {{item.name}}
    span {{item.barcode}}
    span {{item.price}}

现在我被困在如何将数据库传递给 myscript.js 。我无法在 app.js

中执行此操作
router.get('/data', function(req, res, next) {
    var db = req.db;
     db.zero.find(function (err, docs) {
        res.json(docs)
    });
});

原因是正在使用jade模板,并且需要使用res.render来正确显示页面,但是如果我使用router.get('/data', function(req, res, next) { res.render('data', { title: 'Bookshop | Categories' }); });我无法传递数据库。

我知道我无法同时使用res.render和res.json。是否存在将数据库传递给角度的解决方案?或者我必须将玉转换为HTML?我相信如果我使用html文件,我可以使用res.json

由于

2 个答案:

答案 0 :(得分:5)

没有。 res.render()呈现模板并将其发送给客户端。使用Content-Type时,回复res.render()标题为text/html。但是res.json()会以json格式向客户端发送数据,因此响应的Content-Type标头将为application/json

<强>更新

您必须创建两条路线才能达到您想要的效果。第一条路线将渲染您的玉石模板。并且为了在Angular控制器中从服务器检索数据作为JSON,您需要使用另一个路由。例如:

router.get('/data', function(req, res, next) {
    res.render('data', { title: 'Bookshop | Categories' });
});

router.get('/data.json', function(req, res, next) {
    var db = req.db;
    db.myCollection.find(function (err, docs) {
        if(err) {
            // Handle error
        } else {
            res.json({title: 'Data', 'mydata': docs});
        }
    });
});

在Angular控制器中,您使用第二条路线,如下所示:

$http.get('/data.json').then(function(res) {
    console.log(res.data);
});

答案 1 :(得分:0)

希望它能够工作并从Angular JS端获取数据...在Node JS中res表示一种类型的return,因此你不能在一个块中返回两次。

 router.get('/data', function(req, res, next) {
        var db = req.db;
        db.myCollection.find(function (err, docs) {


         if(err) {
            res.send(err);
           }
        else{

            res.send({ title: 'Data', 'mydata': docs }); 
        }
        });
    });