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

olo*_*olo 3 mongodb node.js express angularjs

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

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
Run Code Online (Sandbox Code Playgroud)

对于每个模板,我将需要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' });
});
Run Code Online (Sandbox Code Playgroud)

app.js我已经正确设置了我的MongoDB.

var mongojs = require('mongojs');
var db = mongojs('book', ['books']);
Run Code Online (Sandbox Code Playgroud)

我要实现的是将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;
    });
});
Run Code Online (Sandbox Code Playgroud)

data.jade文件看起来像这样

p(ng-repeat="item in books")
    span {{item.name}}
    span {{item.barcode}}
    span {{item.price}}
Run Code Online (Sandbox Code Playgroud)

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

router.get('/data', function(req, res, next) {
    var db = req.db;
     db.zero.find(function (err, docs) {
        res.json(docs)
    });
});
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Mus*_*aie 6

否.res.render()呈现模板并将其发送给客户端.响应Content-Type使用时首标res.render()将是text/html例如.但是res.json()json格式将数据发送到客户端,因此Content-Type响应的标头将是application/json.

UPDATE

你必须创建两条路线才能达到你想要的效果.第一条路线将渲染您的玉石模板.并且为了在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});
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

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

$http.get('/data.json').then(function(res) {
    console.log(res.data);
});
Run Code Online (Sandbox Code Playgroud)