Javascript 在EJS中显示搜索到的mongodb文档的一部分

Javascript 在EJS中显示搜索到的mongodb文档的一部分,javascript,node.js,mongodb,ejs,Javascript,Node.js,Mongodb,Ejs,我试图显示mongodb在EJS中搜索的已搜索文档。但到目前为止,我只设法以json格式一次显示整个文档。但是现在我只想显示其中的一部分,而不是整个文档。但出于某种原因,我尝试只显示其中的一部分,当您在浏览器中预览该字段时,该字段将保持为空。本例中的字段是:“otherusername”。为此,我使用了:nodejs、mongodb、express和EJS Index.js: router.post('/searchplayer',确保重新验证,函数(req,res){ const{text}

我试图显示mongodb在EJS中搜索的已搜索文档。但到目前为止,我只设法以json格式一次显示整个文档。但是现在我只想显示其中的一部分,而不是整个文档。但出于某种原因,我尝试只显示其中的一部分,当您在浏览器中预览该字段时,该字段将保持为空。本例中的字段是:“otherusername”。为此,我使用了:nodejs、mongodb、express和EJS

Index.js:

router.post('/searchplayer',确保重新验证,函数(req,res){
const{text}=req.body;
变量输入=文本
User.findOne({charactername:text})
。然后(用户=>{
如果(用户){
const{MongoClient}=require(“mongodb”);
console.log('player found')
连接(url,函数(错误,数据库){
如果(错误)抛出错误;
var dbo=db.db(“数据库测试”);
var query={charactername:text};
dbo.collection(“users”).find(query).toArray(函数(错误、查询、结果){
如果(错误)抛出错误;
var myJSON=JSON.stringify(查询,null,12)
log(myJSON);
res.render('playersearch'{
用户:req.user,
能量:myJSON.energy
})
控制台日志(能量)
db.close();
})
});
}否则{
console.log(“播放器不存在”)
res.redirect('main')
}
})

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

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


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

尝试使用JSON.parse而不是JSON.stringfy。如果我不使用stringfy,文档ejs只会说:object object。我不完全确定我将如何做到你所说的,你能给我一个小例子说明这是如何做到的吗?如果我尝试了,那么错误就会出现:JSON中位置1处出现意外的标记o。EJS调用toString,根据你告诉它呈现的内容。这就是为什么在告诉“对象”渲染对象时会看到“对象”。如果您在EJS代码中使用点表示法一次访问一个属性,它将能够以外观良好的方式呈现属性。很难准确地看到应用程序中发生了什么。我缺乏背景。EJS文档示例向您展示了如何在调用时将数据传递给渲染函数时渲染数据。这取决于您是否知道要传递的数据,并确保正确传递。我建议退一步,使用调试技术(比如控制台记录变量或在IDE中的调试器中观察变量),这样您就可以准确地理解如何调用render。此外,现在我在桌面上,我注意到您可能正在
const url=''中发布MongoDB数据库的凭据。你问的其他几个问题中也有这个代码。您应该将其从问题中删除,然后重新创建MongoDB数据库。即使这只是一个测试,人们也可以登录它并在其中保存不好的东西。当您在堆栈溢出上共享类似的内容时,您永远不希望包含主机名或密码。祝你好运