首页 > 解决方案 > 显示来自 MongoDB 的结果

问题描述

不是 JavaScript/Node.js/数据库专业人士,只是想了解一些关于 Node.js 和 MongoDB 的基本概念。我陷入了以下困境:

我想在页面上显示来自 mongoDB 的查询结果,但除了在控制台中,我无法在其他任何地方这样做。

这是我用来查询 mongodb 的模块:

var MongoClient = require('mongodb').MongoClient;

function getOwner(currentSite){
    const urlM = "xxxx";     
    MongoClient.connect(urlM,{ useUnifiedTopology: true, useNewUrlParser: true },function(err, db) {
    if (err) throw err;
    var dbo = db.db("TrainingDB");
    dbo.collection("SiteOwners").find({SiteName: currentSite}).toArray(function(err,result){
        if (err) throw err;
        console.log(result[0].SiteOwner) //this shows correct result
        db.close();
        return result[0].SiteOwner //this doesn't do anything
    })                
});
};

exports.getOwner=getOwner;

控制台显示正确的结果,但不返回任何值。这是我用于检索数据的处理程序:

var apps = require("./apps");   
     
function site1(response){
        console.log("Request handler 'site1 has been called.")
            response.writeHead(200,{"Content-Type": "text/html"});
            response.write("Welcome to Site1</p>The Owner of this site is: "+apps.getOwner("Site1"));
            response.end();
    };

+apps.getOwner("Site1")返回未定义。

标签: javascriptnode.jsmongodb

解决方案


您的return语句不会为该getOwner函数返回任何内容。而是返回...function(err,result){.

我会让你的函数返回一个你可以解决并得到结果getOwner的承诺:site1

function getOwner(currentSite){
    const urlM = "xxxx";
    return new Promise(resolve => {
      MongoClient.connect(urlM,{ useUnifiedTopology: true, useNewUrlParser: true },function(err, db) {
        if (err) throw err;
        var dbo = db.db("TrainingDB");
        dbo.collection("SiteOwners").find({SiteName: currentSite}).toArray(function(err,result){
            if (err) throw err;
            console.log(result[0].SiteOwner) //this shows correct result
            resolve(result[0].SiteOwner)
            db.close();
        })                
      });
    })
}

然后,在您的site1函数中执行以下操作:

function site1(response){
    apps.getOwner("Site1")
      .then(result => {
        console.log("Request handler 'site1 has been called.")
        response.writeHead(200,{"Content-Type": "text/html"});
        response.write("Welcome to Site1</p>The Owner of this site is: "+result);
        response.end();
      })
};

推荐阅读