簡體   English   中英

獲取返回的貓鼬對象

[英]get object of returned mongoose find

嗨,我正在嘗試訪問貓鼬中的查找返回的元素,並且在異步和回調情況下遇到了一些麻煩。

這是用於更好理解的代碼。

function retrieveBudgets(email, callback) {
        models.User.find({email: email},{budget:true}, function(err,budgets) {
        if (err) {
            callback(err, null);
        } else {
            callback(null, budgets);
        }
    });
};

retrieveBudgets(user.email, function(err, budgets) {
    if (err) {
        console.log(err);
    }
    budgets.forEach(function(budget){
        console.log(JSON.stringify(budget, null, 4));
    });

});

所以這行console.log(JSON.stringify(budget, null, 4)); 正常工作,並以json格式將對象打印到屏幕上,但是如何從此處將每個對象存儲到對象數組? 如果我嘗試在同一行推送到數組,則會收到錯誤消息。

我已經看到一些類似的問題,但是我並沒有取得任何進展。 編輯:____________________________________________________________________________我做了一點修改,使其正常工作,我將res.render移到了上面,以便在回調的同時完成頁面的渲染,但是我不能認為這是正確的解決方案

    var user=req.session.user;
    res.locals.budgets=[];

    function retrieveBudgets(email, callback) {
        models.User.find({email: email},{budget:true}, function(err, budgets) {
            if (err) {
                callback(err, null);
            } else {
                callback(null, budgets);
            }
        });
    };

    retrieveBudgets(user.email, function(err, budgets) {
        if (err) {
            console.log(err);
        }
            res.locals.budgets = budgets.map((function(b){ return b; });

        res.render('budget/budget.jade',{ csrfToken: req.csrfToken() });
    });

這樣行之有效的,我可以通過當地人獲得預算,因此對此是否有任何反饋都是很好的,我懷疑這樣做是否正確?

您從retrieveBudgets調用獲得的budgets返回值已經是一個數組。

您對budgets.forEach的調用證明了這一點,該方法是數組的一種方法。

有沒有必要根據這些物品創建一個新的陣列? 可以很容易做到:

var myNewArray = budgets.map((function(b){ return b; });

這一行代碼會將原始的預算數組映射到包含每個預算項目的新數組。

還有其他創建新數組的方法,具體取決於您需要執行的操作

從下面的評論更新

我真正想做的是在查詢外部使用預算,以便將其傳遞給視圖

在這種情況下,您需要從回調中渲染視圖並將預算傳遞給視圖:


router.get("/foo", function(req, res, next){

  retrieveBudgets(user.email, function(err, budgets) {
    if (err) { return next(err); }

    res.render('budget/budget.jade',{ 
      budgets: budgets,
      csrfToken: req.csrfToken() 
    });
  });

});

這是完成這項工作的唯一且正確的方法。

如果您嘗試執行此操作而不等待回調完成,則budgets數組中將沒有任何數據。 因此,您必須等待回調執行完畢,然后將budgets (或單一budget或其他budget )傳遞給視圖來呈現視圖。

(使用promise可以做到這一點,但我發現回調是處理此問題的更簡便方法。)

轉行將對象傳遞到玉文件的行

res.render('budget/budget.jade',{
  csrfToken: req.csrfToken(), 
  budgets: budgets.map(function(b) {return b;})
});

這會將budgets傳遞到您的玉器文件,您應該可以在其中訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM