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
});
})
我有一个 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
});
})