我如何编写一个从mongodb查询的辅助函数,然后可以为任何ejs模板调用此函数

问题描述 投票:0回答:1

我想编写一个带有一个参数id的函数,以便此mongo传递给我的home.ejs

此查询示例:

db.getCollection('users').find('5da85558886aee13e4e7f044', {image: 1})

示例我有一条路线。

routes / 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我可以在getUserimage('5da85558886aee13e4e7f044')

列表的循环内像ids那样调用

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]

node.js mongodb express mongodb-query ejs
1个回答
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文件位于同一目录中。

© www.soinside.com 2019 - 2024. All rights reserved.