我如何编写一个从 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 时,它给了我正确的结果。但是当我像这样在&lt;%=getUserImage("5d999578aeb073247de4bd6e")%&gt; 文件中调用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 模板调用此函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB Java 中编写地理空间查询

如何拦截和记录 mongodb 查询? [复制]

我们如何从带有 debezium kafka 连接器的副本集中的辅助 mongodb 节点跟踪 oplog?

Item 5: Write Helper Functions Instead of Complex Expressions(编写辅助函数,而不是复杂的表达式)

Item 5: Write Helper Functions Instead of Complex Expressions(编写辅助函数,而不是复杂的表达式)

如何编写以下MongoDB查询