我正在尝试将数据从我的数据库传递到客户端(EJS模板)。 但是,数据没有输出,我没有收到任何错误。 所以我试着将数据控制台。将数据记录到我的终端,它确实显示,它只是没有显示在ejs页面上。
这是我的代码:
<div class="row">
<!-- LOCAL INFORMATION -->
<div class="col-sm-6">
<div class="well">
<h3><span class="fa fa-user"></span> Local</h3>
<p>
<strong>id</strong>: <%= user._id %><br>
<strong>email</strong>: <%= user.local.username %><br>
<strong>password</strong>: <%= user.local.password %><br />
<strong>text</strong>: <%= text %>
</p>
</div>
</div>
这是后端:
app.get('/profile', isLoggedIn, (req, res) => {
var text;
MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => {
db.collection("data", (err, collection) => {
collection.find().toArray((err, res) => {
if(err){
throw err;
}
text = res[0].string;
console.log(text);
});
});
});
res.render('auth/profile', {
user: req.user,
text: text
});
});
请注意,有一个console.log(text)
,它会向终端输出正确的文本,我只是将问题传递给客户端。所有用户的数据也正确输出。
答案 0 :(得分:2)
您需要在查询的回调中使用res.render
,例如:
app.get('/profile', isLoggedIn, (req, res) => {
var text;
MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => {
db.collection("data", (err, collection) => {
collection.find().toArray((err, response) => {
if(err){
throw err;
}
text = response[0].string;
console.log(text);
res.render('auth/profile', {
user: req.user,
text: text
});
});
});
});
});
现在设置它的方式是在回调完成之前执行它并且超出范围。此外,您通常不希望将数据库连接放在路由中。您可能希望在节点服务器启动时执行一个数据库连接,然后将该连接传递给路由以重新使用连接,否则每次路由被命中时,都会重新连接到数据库。
要添加,您也不希望throw err
,因为这将停止您的节点进程(我假设您正在使用快速?)。而只是记录错误或返回res.render
并包含错误,以便您可以在视图中处理错误。
编辑:
在toArray
的回调中,您必须将回复的名称从res
更改为response
或res
以外的任何内容,因此您不要覆盖服务器res
对象。