mongodb 查询数据到 html 下拉列表

mongodb query data to html drop down

我有一个 mongo 数据库,其中包含国家及其相关城市。 我想从数据库中提取国家,并将该数据放入 HTML 下拉选择列表中。

我在 mongodbActions.js 中有以下内容用于连接到我的 mongodb 实例,并进行国家/地区的查询和 returning。

const {MongoClient} = require('mongodb');
const uri = "mongodb://127.0.0.1:27017";
const client = new MongoClient(uri);
const Promise = require('rsvp').Promise;

// exporting functions
module.exports = {
    mongodbConn: async function() {
        try {
            // Connect to the mongodb server
            await client.connect();
            // Establish and verify connection
            await client.db("admin").command({ ping: 1 });
            console.log("Successfully connected to mongo DB.");

        } catch (e) {
            console.error(e);
        } finally {
                await client.close();
                console.log("Successfully closed connection to mongo DB.");
        }
    },
    mongodbGetCountries: function() {
        return new Promise(function(resolve, reject) {
            const dbo = client.db('mydb').collection('countries_cities');
            let dbCountries = dbo.distinct('country', function(err, dbCountries) {
                if (err) {
                    reject(err);  
                } else {
                    resolve(dbCountries);
                }
            });
        });
    },
};

我使用了 Promises,因为使用了一个异步函数,并尝试 return 这个值,当我试图在我的 server.js[ 中访问它时,结果是 Promise { <pending> } =24=]

然后我有 server.js,其中包含以下内容:

// load the express module
const express = require('express');
// load boad-parser module
const bodyParser = require('body-parser');

const mongodbActions = require('./static/scripts/mongodbActions')
console.log(mongodbActions)
// init db connection
mongodbActions.mongodbConn()

// get countries from db
let dbCountries = mongodbActions.mongodbGetCountries().then(function (items) {
    console.info('The promise was fulfilled with items!', items);
    return items
}, function(err) {
    console.error('The promise was rejected', err, err.stack);
});
console.log('server side countries:')
console.log(dbCountries)

const index = 'index.pug';

const app = express();

app.use(bodyParser.urlencoded({extended: true}))
app.use(express.urlencoded({extended: true}))
app.use(express.static(__dirname+'/static'));

// index page
app.get('/', function (req, res) {
    console.log(req.url);
    // weather info / data -> display set to on
    let weatherVisibilty = 'visibility_on';
    let countryList = dbCountries
    res.render(index, { 
        countryList: countryList,
        setVisibility: weatherVisibilty 
    });
})

下面的代码块显示了列表中的国家/地区,就像我想要的那样。

// get countries from db
let dbCountries = mongodbActions.mongodbGetCountries().then(function (items) {
    console.info('The promise was fulfilled with items!', items);
    return items
}, function(err) {
    console.error('The promise was rejected', err, err.stack);
});

The promise was fulfilled with items! [
  'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR',
  'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE',
  'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ',
  'BR', 'BS', 'BT', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF',
  'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU',
  'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO',
  'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ',
  'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG',
  'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT',
  'GU', 'GW', 'GY', 'HK', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE',
  ... 146 more items
]

但是下面的块,我希望它是上面 items 的值。

console.log('server side countries:')
console.log(dbCountries)

Returns以下:

server side countries:
Promise {
  _id: 1,
  _label: undefined,
  _state: undefined,
  _result: undefined,
  _subscribers: []
}

所以那是不是我想要的国家列表。

我想传递到我的 pug 文件:index.pug 作为我的下拉选择列表的内容。

请注意,我是 javascript 和 mongodb 的菜鸟。

非常感谢您的帮助和指导。

您无法从该函数本身范围之外的异步函数获取数据。您可以在 SO 上阅读 this answer 以更好地了解异步调用的工作原理。

这就是为什么 console.log(dbCountries) 总是 return 承诺。

我建议您使用 async/await 并修改您的 GET 路线

app.get('/', async (req, res) => {
    console.log(req.url);
    // weather info / data -> display set to on
    let weatherVisibilty = 'visibility_on';

    let dbCountries = await mongodbActions.mongodbGetCountries();
    let countryList = dbCountries

    res.render(index, { 
        countryList: countryList,
        setVisibility: weatherVisibilty 
    });
})