猫鼬和MongoError

时间:2020-01-18 19:02:04

标签: node.js mongodb mongoose

我遇到一个奇怪的错误。我猜是因为我没有正确处理该错误以获取更多信息。这是我遇到的错误。我在这里搜索失败,但没有找到类似的结果。这些文档只是让我感到困惑。

{"name":"MongoError","level":"error","service":"user-service"}

这是我的连接脚本:

const mongoose = require('mongoose'),
      logger   = require('./logging');

async function connect(){

  await mongoose.connect("mongodb://localhost:27017/fdData")
    .catch(error => {
      logger.error(error);
  });
}

async function disconnect(){
    await mongoose.disconnect()
    logger.info('DB disconnected');
}

module.exports= {connect, disconnect}
}

module.exports= {connect, disconnect}

这就是我所说的。 (这只是脚本的一小段)。

在太平洋标准时间1024am更新1/20/20。

  • (已从weather.js中删除了db.connect()和db.disconnect.db.connect 发生在app.js上。 weather.js检查猫鼬准备状态并报告 状态为1(已连接)。
  • 已将猫鼬Op结果添加到记录器中,因此现在我们可以看到 尝试在控制台中执行猫鼬操作。
//schema setup

const weatherSchema = new mongoose.Schema({
        condition: String,
        temp: Number,
        windDir: String,
        windSpd: Number,
        windGust: Number,
        windChill: String,
        humidity: Number,
        icon: String,
        tempIcon: String,
        date: String,
        updated: String,
    });

const weatherWarningSchema = new mongoose.Schema({
        warning: String,
        warningStart: String,
        warningExpire: String,
        warningBody: String,
        id: String,
        date: String,
    });

const Weather = mongoose.model("weather", weatherSchema);
const Warning = mongoose.model("warning", weatherWarningSchema);

currentWeather=[];

async function saveWeather(update){

/////////commented Out for troubleshooting//////////
    // await db.connect() 
    //     .then(error=>{logger.error(error)
/////////end comments/////////////
            Weather.findOneAndUpdate({date: update.date}, 
                {   date:update.date, 
                    condition:update.condition,
                    temp:update.temp, 
                    windChill:update.windChill, 
                    windDir:update.windDir, 
                    windSpd:update.windSpd, 
                    windGust:update.windGust, 
                    humidity:update.humidity, 
                    icon:update.icon, 
                    tempIcon:update.tempIcon, 
                    updated:update.updated}, 
                {upsert:true,
                new: true,}, 
                function(error, result){
                    if (error){
                        logger.error(error);
                    } else{
                        console.log(result);
                        logger.info('Weather Saved to DB '+moment().utcOffset(-8).format('HH:mm'))
                    }
                })
                console.log('Mongoose Ready State: '+mongoose.connection.readyState)
///////commented out for troubleshooting////////
        // }).then((res, error)=>{
        //     if(error){
        //         logger.error(error)
        //     }
            // db.disconnect();
        // })
/////////end comments/////////

}

这是控制台中完整的初始输出:

获取刻录数据...

正在更新天气数据...

(节点:3890)DeprecationWarning:不建议使用当前的“服务器发现和监视”引擎,并将在以后的版本中将其删除。要使用新的“服务器发现和监视”引擎,请将选项{useUnifiedTopology:true}传递给MongoClient构造函数。

(节点:3890)DeprecationWarning:不建议使用当前URL字符串解析器,并且在以后的版本中将其删除。要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect。

{“消息”:“仪表板服务器正在3000上运行”,“级别”:“信息”,“服务”:“用户服务”}

{“消息”:“船员令牌是当前的”,“级别”:“信息”,“服务”:“用户服务”}

{“消息”:“ A911令牌为当前”,“级别”:“信息”,“服务”:“用户服务”}

猫鼬就绪状态:1

{ _id:5e25ef3d8c936f22f7722326, 日期:“ 2020-01-20”, __v:0, 条件:“晴天”, 湿度:96, 图标:“ sunny.png”, 温度:34, tempIcon:“ https://cdn.aerisapi.com/wxicons/v2/cold.png”, 更新:“ 01/20/20 10:19”, windChill:“ 34”, windDir:“ N”, windGust:0, windSpd:0 }

{“消息”:“天气已保存到数据库10:19”,“级别”:“信息”,“服务”:“用户服务”}

正在保存刻录数据...

刻录数据已保存。

2 个答案:

答案 0 :(得分:0)

错误告诉您db disconnected,实际上是您没有等待updateOne函数返回的承诺。

您应该在此处添加await来解决此问题。

await db.connect()
    .then(async (error) {
       logger.error(error)
       console.log('Saving Weather... '+mongoose.connection.readyState) //"Saving Weather...1"

       await Weather.updateOne({date: update.date}, 
                   ... )

    }).then((res, error)=>{
       if(error){
          logger.error(error)
       }
       db.disconnect();
   })

答案 1 :(得分:0)

我知道了!!!

Mongoose和MongoDB运行正常。问题出在currentWeather数组的分配中。我将新数据推送到阵列上,而不是替换它。因此,我的脚本不断将currentWeather[0]放入数据库中,这就是为什么它将一次又一次不起作用的原因。