【问题标题】:How can I pass the return value from mongo query to express template如何将 mongo 查询的返回值传递给表达模板
【发布时间】:2019-10-31 21:40:31
【问题描述】:

我正在尝试创建一个在模板中使用的辅助函数。

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

我应该如何以正确的方式创建这个助手?

【问题讨论】:

    标签: node.js mongodb express ejs


    【解决方案1】:

    这是因为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 });
        });
    }
    

    这只是一个伪代码,您可以随意在代码中使用此概念。请记住,必须在回调函数中调用渲染。

    【讨论】:

    • 可以帮助您提供代码解决方案的答案示例
    • 这对我来说比较复杂,我不知道该怎么做,对我来说非常初学者
    • 如果它看起来更复杂,那么您可以使用 async await 来简化它。但是,在这种情况下,您将不得不修改 retrieveUser 函数以返回一个承诺而不是使用回调。
    猜你喜欢
    • 2016-10-18
    • 2017-09-20
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2019-02-05
    • 2022-12-02
    相关资源
    最近更新 更多