首页 > 解决方案 > 将 mongodb 集合项添加到不和谐嵌入

问题描述

我想使用 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);
        }

标签: javascriptmongodbdiscord.js

解决方案


如果您查看 MongoDB 文档,您会看到它mongoDb.connect 返回一个 Promise。这意味着您的代码将连接到您的数据库,但它会在后台这样做。同时,它将继续处理您的其余代码,因此它将在添加所有字段之前发送嵌入。

您可以通过将message.channel.sendin 移至 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);
  });
}

推荐阅读