我想使用MongoDB ForEach函数将集合文档添加到嵌入中。
当我想在foreach内的嵌入中添加字段时,它将发送嵌入,并跳过和添加字段。当我进行控制台登录时,似乎代码发送了消息,然后添加了字段。
const Discord = require("discord.js");
const mongoDb = require("mongodb").MongoClient;
let showEmbed = new Discord.RichEmbed();
let proccess = 0;
module.exports.show = (message, page) => {
mongoDb.connect('mongodb+srv://admin:31045@robot-xi9jt.gcp.mongodb.net/eco?retryWrites=true', {
useNewUrlParser: true
}, function (err, db) {
if (err) console.log(err);
let dbo = db.db("eco");
dbo.collection("items").find({
itemPage: page
}).forEach(function (doc) {
console.log(`${doc.itemName} : ${doc.itemPrice} : ${doc.itemDescription}`)
showEmbed.addField(`**${doc.itemName}** | $${doc.itemPrice}`, doc.itemDescription, false);
})
});
message.channel.send(showEmbed);
}
答案 0 :(得分:2)
如果检查MongoDB文档,您将看到mongoDb.connect
returns a Promise。意味着您将代码连接到数据库,但它将在后台连接。同时,它将继续您的其余代码,因此它将在添加所有字段之前发送嵌入内容。
您可以通过将message.channel.send
移到Promise中来轻松解决此问题,
const Discord = require("discord.js");
const mongoDb = require("mongodb").MongoClient;
let showEmbed = new Discord.RichEmbed();
let proccess = 0;
module.exports.show = (message, page) => {
mongoDb.connect('Your connect URL here', { useNewUrlParser: true }, function (err, db) {
if (err) console.log(err);
let dbo = db.db("eco");
dbo.collection("items").find({
itemPage: page
}).forEach(function (doc) {
console.log(`${doc.itemName} : ${doc.itemPrice} : ${doc.itemDescription}`)
showEmbed.addField(`**${doc.itemName}** | $${doc.itemPrice}`, doc.itemDescription, false);
});
message.channel.send(showEmbed);
});
}