Как я могу написать вспомогательную функцию, которая является запросом от mongodb, а затем может вызвать эту функцию для любого шаблона ejs - PullRequest
2 голосов
/ 27 октября 2019

Я хочу написать функцию с одним параметром id, чтобы этот монго передавал моему home.ejs.

Пример с этим запросом:

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

Пример У меня есть маршрут.

route / 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, он дал мне правильный результат. но когда я вызываю view.ejs как этот <%=getUserImage("5d999578aeb073247de4bd6e")%> файл, он дает мне [object Promise]

1 Ответ

2 голосов
/ 29 октября 2019

Создайте файл, назовем его 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.

...