【问题标题】:How to res.json and res.render at the same time, pass mongo db to angularjs?如何同时 res.json 和 res.render,将 mongo db 传递给 angularjs?
【发布时间】:2016-07-19 10:01:55
【问题描述】:

我用的是express,自带jade模板引擎。 app.js

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

对于每个模板,我都需要 res.render 来渲染 html 标头,如果我不使用 res.render,模板/页面将不会显示。 routes/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,然后循环输入到玉文件中。 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

谢谢

【问题讨论】:

  • 你不能两者都做。 res.json 只发送数据,res.render 将渲染传递给 render 方法的模板。你想要什么?你能解释一下吗?
  • 我需要将 DB 传递给 angular,但如果我没有 res.render,我的页面就会出错。看起来只有 res.json 可以成功发送 DB,所以如果有办法让模板渲染也可以通过 DB,谢谢
  • 将 DB 传递给 Angular 是什么意思?我已经可以看到您正在将文档从 mongo DB 传递回您的客户。

标签: angularjs node.js mongodb express


【解决方案1】:

希望它能正常工作并从 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 }); 
        }
        });
    });

【讨论】:

  • 谢谢,但是如果我使用这种方法,我没有得到 Mongo 数据库。我得到的对象就像 html 的东西。
【解决方案2】:

没有。 res.render() 呈现模板并将其发送给客户端。例如,使用 res.render() 时的响应 Content-Type 标头将是 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);
});

【讨论】:

  • 谢谢,如果我不使用res.render(),只使用res.json 页面看起来像一个破损的页面。如您所见,我有 'mydata': docs ,有没有办法让 Angular 获得 mydata 变量?谢谢
  • @olo 更新了我的答案
  • 但是如果我们不使用render,我们如何拥有Content-Type header,因为我使用jade。
  • @olo 当您使用res.json() express 时,它自己会为您设置内容类型为application/json。当您使用 res.render() 时,express 将使用给定数据加载和呈现模板,并将其与 text/html 内容类型一起发送到客户端。
  • @olo 如果这不是您问题的答案,您必须编辑您的问题以澄清您的问题。请参阅我更新的答案,了解您在问题中的确切含义。
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 2021-08-11
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多