我使用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
由于
答案 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 });
}
});
});