【问题标题】:Display a part of the searched mongodb document in EJS在 EJS 中显示部分搜索到的 mongodb 文档
【发布时间】:2021-06-02 09:22:48
【问题描述】:

我正在尝试显示 mongodb 在 EJS 中搜索的搜索文档。但到目前为止,我只设法将整个文档一次显示为 json 格式。但现在我只想显示其中的一部分而不是整个文档。但是由于某种原因,为什么我尝试只显示其中的一部分,当您在浏览器中预览它时,该字段将保持空白。在这种情况下,该字段是:“其他用户名”。为此,我正在使用:nodejs、mongodb、express 和 EJS。

Index.js:

router.post('/searchplayer', ensureAuthenticated, function(req, res){
const {text} = req.body;
var input = text
User.findOne({charactername: text})
.then(user => {
if(user) {
const { MongoClient } = require("mongodb");
console.log('player found')
MongoClient.connect(url, function(error, db) {
  if (error) throw error;
  var dbo = db.db("Databasetest");
  var query = { charactername: text };
  dbo.collection("users").find(query).toArray(function(error, query, result) {
    if (error) throw error;
    var myJSON = JSON.stringify(query, null , 12)
    console.log(myJSON);
    res.render('playersearch',  {
      user: req.user,
      energy: myJSON.energy
    })
    console.log(energy)
    db.close();
  })
});
} else {
console.log("Player does not exist")
res.redirect('main')
}
})
})

这里发生的情况是,有人通过输入名称进行搜索,一旦在 MongoDB 中的“用户”集合中找到它,它会将您重定向到另一个页面。它应该在哪里呈现属于所搜索名称的信息。但问题是我无法在 EJS 中显示单个字段,所以为了澄清 myJSON 是 MongoDB 找到的整个文档,它是字符串化的。

在这种情况下,我尝试显示能量字段,因为它存在于该文档中,但这只会在“其他用户名”字段中返回一个空字段。我还尝试在该字段中写入例如:myJSON.energy,但是当我在浏览器中预览它时,由于某种原因,这也会返回一个空字段。

playersearch.ejs:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="/static/CSS/styleofplayersearch.css" rel="stylesheet" type="text/css">
        <link rel="stylesheet" href="">
    </head>
    <body>
     <title>test</title>
     <img id= "backgroundimage"  draggable="false" src="/static/images/post_apocalyptic_landscape.jpg">  
     <div id= "blackbackground"  draggable="false"></div>  

    <h4 id="otherusername"><%=energy%></h4> 
 
    


<script>
</script>





    <a id="logouttext" href="/users/logout">Logout</a> 
    </body>
</html>

我的问题是如何只渲染 Mongodb 找到的文档的一部分而不是整个文档?

【问题讨论】:

  • 尝试使用 JSON.parse 而不是 JSON.stringfy。

标签: javascript node.js mongodb ejs


【解决方案1】:

您遇到的根本原因是您正在创建一个字符串(JSON.stringify 的输出),然后尝试访问该字符串的未定义的“能量”属性。您在传递给 EJS 模板的内容中包含该未定义的值,然后尝试渲染它,这会导致 EJS 渲染未定义,从而导致什么也没有出现。您的 EJS 代码看起来不错,只是您没有向模板发送正确的数据。

您可以传递对象本身,而不是从 MongoDB 序列化整个匹配的文档并在呈现它时将该字符串传递给您的 EJS 模板。渲染系统可以处理。然后,在 EJS 文件中,使用点表示法仅访问要呈现的属性。您应该使用此技术来呈现示例中所属对象的“能量”属性。

一个好的做法是只将需要渲染的数据传递给模板系统,尤其是在涉及敏感数据的情况下。因此,在该示例中,您只需将能量属性传递给您调用渲染的模板系统。

【讨论】:

  • 好吧,如果我不对文档进行字符串化,ejs 只会说:object Object。而且我不完全确定我将如何做到你所说的,你能给我一个小例子来说明这怎么可能吗?
  • 如果我尝试这样做,则会出现错误:出现位置 1 处 JSON 中的意外标记 o。
  • EJS 根据您告诉它渲染的内容调用 toString。这就是为什么当您告诉它渲染对象时会看到“对象对象”。如果您在 EJS 代码中使用点表示法一次访问一个属性,它将能够以看起来不错的方式呈现属性。
  • 很难确切地看到您的应用程序中发生了什么。我缺乏背景。 EJS 文档示例向您展示了如何在调用时将数据传递给渲染函数来渲染数据。您需要知道自己传递的数据并确保它被正确传递。我建议退后一步并使用调试技术(例如控制台记录变量或在 IDE 的调试器中观察变量),以便您可以准确了解您是如何调用渲染的。
  • 另外,现在我在桌面上,我注意到您可能正在const url = '&lt;redacted&gt;'; 中发布您的 MongoDB 数据库的凭据。该代码也出现在您提出的其他几个问题中。您应该从问题中删除它并重新创建您的 MongoDB 数据库。即使只是一个测试,人们也可以登录进去,把不好的东西保存在里面。当你在 Stack Overflow 上分享类似的东西时,你永远不想包含主机名或密码。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2017-07-11
  • 2022-12-05
  • 2018-11-23
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多