【问题标题】:I need to save a value from a map on database我需要从数据库的地图中保存一个值
【发布时间】:2020-11-10 00:20:00
【问题描述】:

好吧,我需要帮助才能将 const 映射中的值保存到数据库中。 我在一些论坛上进行了搜索,阅读了 MongoDB 文档,但我一无所获,那么,如何从 mongodb 上的地图(单独)中保存一个值?

const mongoose = require('mongoose');
const Members = require('../models/Members');
const { DATABASE } = require('../../config/config.json');

module.exports.run = async (Client, message, args) => {
  const ServerCache = Client.guilds.cache.get('719394166483845210');

  const cacheID = ServerCache.members.cache.map(member => member.user.id);
  const cacheTag = ServerCache.members.cache.map(member => member.user.tag);
  const cacheIsBot = ServerCache.members.cache.map(member => member.user.bot);

  // Database connection
  mongoose.connect(DATABASE.URL, DATABASE.OPTIONS);

  for (var i = 0; i < cacheID.length; i++) {
    if (cacheIsBot[i]) {
      console.log("Este usuário é um BOT, então foi ignorado!");
    } else {

      Members.find({ 'dsID': cacheID[i] }, (err, discordID) => {
        if (discordID.length >= 1) {
          console.log("Este usuário já está cadastrado");
          return;
        }

        const MembersDocument = new Members({
          dsID: cacheID[i],
          dsTag: cacheTag[i]
        });

        MembersDocument.save();
      });
    }
  }
}

【问题讨论】:

    标签: javascript node.js mongodb mongoose discord.js


    【解决方案1】:

    您在 for 循环中使用了异步函数。所以循环在函数响应之前结束。您可以为此使用异步模块。

    const mongoose = require('mongoose');
    const Members = require('../models/Members');
    const async = require("async");
    const { DATABASE } = require('../../config/config.json');
    
    module.exports.run = async (Client, message, args) => {
      const ServerCache = Client.guilds.cache.get('719394166483845210');
    
      const dsID = ServerCache.members.cache.map(member => member.user.id);
      const dsTag = ServerCache.members.cache.map(member => member.user.tag);
      const dsIsBot = ServerCache.members.cache.map(member => member.user.bot);
    
      // Database connection
      mongoose.connect(DATABASE.URL, DATABASE.OPTIONS);
    
      async.eachSeries(dsID, function (dsIDItem, nextItem) {
          let i = dsID.indexOf(dsIDItem); // for dsTag and dsIsBot index.
          if (dsIsBot[i]) {
          console.log("Este usuário é um BOT, então foi ignorado!")
        } else {
          Members.find({ 'dsID': dsIDItem }, (err, discordID) => {
            if (discordID.length >= 1) { return; }
    
            const MembersDocument = new Members({
              dsID: dsIDItem, // <-- I tried to use [i] to save that map value with for
              dsTag: dsTag[i],
            });
    
            MembersDocument.save(function(){ nextItem(); });
          });
        }
      }, function(err) {
          // end loop
      })
    }
    

    【讨论】:

      【解决方案2】:

      我用其他方式做了,添加一个新变量来引用地图项:

      const dsID = cacheID[i];
      const dsTag = cacheTag[i];
      

      在新文档上

      const MembersDocument = new Members({
          dsID: dsID,
          dsTag: dsTag,
      });
      

      对我来说很好。

      【讨论】:

        猜你喜欢
        • 2018-03-29
        • 2011-10-12
        • 2013-04-30
        • 1970-01-01
        • 2017-03-11
        • 2010-11-10
        • 1970-01-01
        • 2017-02-04
        • 2013-04-28
        相关资源
        最近更新 更多