Как я могу передать возвращаемое значение из запроса Монго в экспресс-шаблон - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь создать вспомогательную функцию для использования в шаблоне.

var User = require("../models/user");
var ObjectId = require('mongodb').ObjectID;

function retrieveUser(id, callback) {
    User.find(ObjectId(id), {image: 1, _id: 0}, function(err, users) {
      if (err) {
        callback(err, null);
      } else {
        callback(null, users[0]);
      }
    }).lean();
  };
function getUserImage(id){
    user_image = null;
    retrieveUser(id, function(err, user) {
        if (err) {
            console.log(err);
        }
        console.log(user.image);
        user_image = user.image
        // do something with user
    });
  return user_image;
}

module.exports.getUserImage = getUserImage;

Я вижу правильное значение в console.log, Но , когда я вызываю это

<%=getUserImage("5d999578aeb073247de4bd6e")%>

home.ejs например, дай мне undefined.

Как правильно создать помощника this?

1 Ответ

1 голос
/ 30 октября 2019

Это происходит потому, что retrieveUser является асинхронной функцией, поэтому оператор return user_image не ожидает завершения retrieveUser. Вы можете использовать синхронную версию этой функции (если она существует) или вам следует сначала вызвать и собрать user_image перед вызовом функции рендеринга и передать ее в функцию рендеринга на вашем маршруте. На мой взгляд, принимая во внимание асинхронную природу JavaScript, второй подход - это написать путь.

Вы можете написать свое промежуточное ПО, чтобы оно выглядело примерно так -

    (req, res, next) => {
     retrieveUser(<ID>, function(err, user) {
        if (err) {
            console.log(err);
        }
        res.render('view_name', { image: user.image });
    });
}

Этотолько псевдокод вы можете использовать эту концепцию в своем коде, как вам нравится. Просто помните, что render должен вызываться в функции обратного вызова.

...