2016-03-31 15 views
2

我使用快遞,它配備了玉器模板引擎。 app.js如何在res.json和res.render同時將mongo db傳遞給angularjs?

// 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) 
    }); 
}); 

的原因正在使用玉模板,需要使用res.render讓頁面顯示正確,但如果我用router.get('/data', function(req, res, next) { res.render('data', { title: 'Bookshop | Categories' }); });我不能通過數據庫。

我知道我無法同時使用res.render和res.json。有沒有解決方案通過數據庫角?或者我必須將玉轉換爲HTML?我相信,如果我使用的html文件,我可以使用res.json

感謝

+0

你不能兩者都做。 'res.json'只發送數據,其中'res.render'將渲染傳遞給render方法的模板。你想要什麼?你可以解釋嗎? –

+0

我需要將DB傳遞給角度,但是如果我沒有res.render,我的頁面會出錯。看起來像只res.json可以成功發送數據庫,所以如果有辦法讓模板呈現也通過數據庫感謝 – olo

+0

你是什麼意思將數據庫傳遞給角?我已經可以看到你正在將文件從mongo DB傳回給你的客戶端。 – Yerken

回答

3

編號res.render()呈現模板並將其發送到客戶端。例如,當使用res.render()時,響應Content-Type將是text/html。但res.json()json格式的數據發送給客戶端,因此Content-Type響應頭將爲application/json

UPDATE

你才能實現你想要的創建兩條路線。第一條路線將呈現您的玉器模板。並且爲了從服務器檢索數據作爲JSON在Angular控制器中,您需要使用其他路由。例如:

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}); 
     } 
    }); 
}); 

而在角控制器採用第二種路線如下圖所示:

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

謝謝如果我不使用'res.render()',只能使用'res.json'這個頁面看起來像一個破損的頁面。你可以看到我有''mydata':docs',有沒有辦法讓Angular獲得'mydata'變量?謝謝 – olo

+0

@olo更新了我的回答 –

+0

但是如果我們不使用渲染,我們如何在使用玉石時擁有Content-Type標題。 – olo

0

希望它會工作,並從角JS結束捕撈數據......在節點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 }); 
     } 
     }); 
    }); 
+0

謝謝,但我沒有得到Mongo數據庫,如果我使用這種方法。我得到的對象就像html的東西。 – olo

相關問題