Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在NodeJS中从MongoDB读取嵌入式文档数据后如何发送响应_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript 在NodeJS中从MongoDB读取嵌入式文档数据后如何发送响应

Javascript 在NodeJS中从MongoDB读取嵌入式文档数据后如何发送响应,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我在MongoDB中有一个文档,其中包含对其他两个文档的引用。我有一个getrestapi,它返回的对象还包含引用文档的详细信息。我已经编写了以下代码。代码正在工作,但是由于异步读取特性,我得到的响应是空的 router.get("/",function(req,res){ LibraryTransaction.find({},function(err,data){ if(err){ res.send(err.message

我在MongoDB中有一个文档,其中包含对其他两个文档的引用。我有一个getrestapi,它返回的对象还包含引用文档的详细信息。我已经编写了以下代码。代码正在工作,但是由于异步读取特性,我得到的响应是空的

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

    LibraryTransaction.find({},function(err,data){

        if(err){
            res.send(err.message);
        }
        else{

            var transactions=[];
            data.forEach(function(element){                                 
                debugger;
                var transaction ={}; 
                var BookName='';
                var ISBNNumber='';
                var UserName='';

                

                Book.findOne({_id:element.book},function(err,book){
                    debugger;

                    if(!book){
                        res.send("Book not found please check ISBN number.");
                    }
                    else{           

                        BookName = book.name;
                        ISBNNumber= book.isbnNumber;
                        User.findOne({_id:element.user},function(err,user){
                            debugger;
                            if(!user){
                                res.send("User not found.");
                            }
                            else
                            {
                                UserName=user.userName;
                                transaction.bookName=BookName;
                                transaction.iSBNNumber=ISBNNumber;
                                transaction.userName=user.userName;
                                transaction.IssueDate=element.issueDate;
                                transaction.DueDate=element.dueDate;
                                transaction.TransactionType=element.transactionType;    
                                console.log(BookName);;
                                transactions.push(transaction);
                            }
                        });         
                    }
                });                 
            });
            console.log("Send");
            res.send(transactions);         
        }
    });
});
我有一个交易文档,其中包含书籍和用户文档的参考信息以及一些其他详细信息,如bookIssueDate、DueDate等。我想返回带有书籍名称、用户名和书籍发行日期、书籍到期日期的数据。但作为回应,我得到的只是图书发行日期和到期日期数据,而不是图书名称和用户名。但读取该数据的代码会形成预期文档


有人能帮我理解在Node.js中处理这个问题的正确方法吗?

在这种情况下,只需进行快速重构,将所有id映射到一个数组中,并在该数组中找到所有具有_id的书籍,在该查询之后,您就拥有了所有书籍,您可以对它们进行操作。显然,在回拨过程中执行
res.send
或任何您想要的操作

LibraryTransaction.find({},函数(err,data){
如果(错误){
res.send(错误消息);
}
否则{
var交易=[];
var bookIds=data.map(函数(元素){return element.book;});
find({u id:{$in:bookIds}},函数(err,books){
//用书本做任何事,然后发回回复,等等!
});       
}
});

Wow,这完全是低效的,永远不要在for语句中进行查询(在本例中)