我如何编写一个从 mongodb 查询的辅助函数,然后可以为任何 ejs 模板调用此函数
Posted
技术标签:
【中文标题】我如何编写一个从 mongodb 查询的辅助函数,然后可以为任何 ejs 模板调用此函数【英文标题】:How Could I Write a helper function which is query from mongodb , and then can call this func for any ejs template 【发布时间】:2020-02-22 21:35:07 【问题描述】:我想用一个参数 id
编写一个函数,让这个 mongo 传递给我的 home.ejs
。
此查询的示例:
db.getCollection('users').find('5da85558886aee13e4e7f044', image: 1)
例如我有一条路线。
路由/users.js
var User = require("../models/user");
var db = require("../secure/db");
var middleware = require("../middlewares/middleware");
//...
router.get("/home", middleware.isAllowed, function(req, res, next)
res.render('home',
title: "Project",
userList: userList,
getUserimage: getUserimage(??)//trying here
)
);
所以在home.ejs
或任何file.ejs
我可以在ids
列表的循环内调用getUserimage('5da85558886aee13e4e7f044')
views/home.ejs
<% layout('layout/layout') %>
//more code
<% for(var i=0; i < userList.length; i++) %>
<div>
<img src ="<%=getUserimage(userList[i].id)%>" > <%=userList[i].name%>
</div>
<% %>
//more code
这是我更新的助手
var User = require("../models/user");
var ObjectId = require('mongodb').ObjectID;
module.exports.getUserImage = async function getUserImage(id)
let result = await User.find(ObjectId(id), image: 1, _id: 0).lean();
console.log(result[0].image);
return result[0].image; //or whatever you wanna return
;
当我console.log
时,它给了我正确的结果。但是当我像这样在<%=getUserImage("5d999578aeb073247de4bd6e")%>
文件中调用view.ejs时,它给了我[object Promise]
【问题讨论】:
【参考方案1】:创建一个文件,我们将其命名为 helper.js。
module.exports.getUserimage = async function(id)
//do something
//replace this with your own code but use the await
let result = await collection.findOne(query);
return result; //or whatever you wanna return
然后在 app.js 中你可以这样做
const helper = require("helper");
app.locals.getUserimage = helper.getUserimage
然后你可以像你正在做的那样在你的 .ejs 模板中调用它。
<% layout('layout/layout') %>
//more code
<% for(var i=0; i < userList.length; i++) %>
<div>
<img src ="<%= getUserimage(userList[i].id)%>" > <%=userList[i].name%>
</div>
<% %>
//more code
app.locals 属性在应用程序的整个生命周期中都存在。提供 helper.js 文件的完整路径。我假设它与 app.js 文件位于同一目录中。
【讨论】:
我可以创建一个单独的文件吗?以及如何包含,可以请指导我更多吗? 我进行了编辑。这将按照您想要的方式进行。 我是使用来自 mongodb 示例 getUserimage(id) User.find(Object(id), image: 1. _id:0 ) 的 getUserimage 查询的问题,我们如何通过异步在这种情况下起作用。 进行了另一次编辑。但是你为什么不只返回一个包含用户图像路径的字符串数组,就像你发送用户列表一样。因为在性能方面没有区别。从本质上调用模板中的方法仍然意味着您在服务器端完成所有工作。 我在模板 ejs 中调用时看到了这个[object Promise]
,请帮忙检查我的更新尝试代码。以上是关于我如何编写一个从 mongodb 查询的辅助函数,然后可以为任何 ejs 模板调用此函数的主要内容,如果未能解决你的问题,请参考以下文章
我们如何从带有 debezium kafka 连接器的副本集中的辅助 mongodb 节点跟踪 oplog?
Item 5: Write Helper Functions Instead of Complex Expressions(编写辅助函数,而不是复杂的表达式)
Item 5: Write Helper Functions Instead of Complex Expressions(编写辅助函数,而不是复杂的表达式)