DeprecationWarning:监听 Db 类上的事件已被弃用,将在下一个主要版本中删除

Posted

技术标签:

【中文标题】DeprecationWarning:监听 Db 类上的事件已被弃用,将在下一个主要版本中删除【英文标题】:DeprecationWarning: Listening to events on the Db class has been deprecated and will be removed in the next major version 【发布时间】:2021-05-17 07:22:01 【问题描述】:

我正在使用 mongoose 和 mocha 进行 MongoDB 架构设计和 API 开发 我收到这个警告... 这是什么意思,它将如何影响我以及解决方法是什么??

在实际警告文字下方:

(node:9872) DeprecationWarning:监听 Db 类的事件已被弃用,将在下一个主要版本中删除。

【问题讨论】:

这能回答你的问题吗? How can I remove this deprecation warning in MongoDB and why is it happening? 【参考方案1】:

更新

mongodb@3.6.5 已退出。

只需更新 mongodb 驱动程序和 mongoose:

npm i mongodb mongoose

这是由猫鼬使用的mongodb@3.6.4 native driver 引起的。

#1 您可以将 mongodb 降级到版本 3.6.3 (described here)。

#2 或者将 mongoose 从 5.11.16 降级回 5.11.15:

npm uninstall mongoose
npm install mongoose@5.11.15

#3 还是等着mongodb@3.6.5发布吧。

【讨论】:

我认为您的意思是 3.6.4 而不是 2.6.4 @kmgt mongoose 版本^5.10.12 和Mongodb 版本4.4 出现此错误应该怎么办?还需要用猫鼬版5.11.15吗? 好的。我认为它是 mongodb 版本,它是 mongodb 驱动程序版本。是的,安装的mongodb驱动版本是3.6.3 @kmgt 这个警告可以忽略还是我需要降级 Mongoose?由于无法降级 Mongodb 驱动程序,我已经安装了 3.6.3 版本。 存在依赖关系。 Study this.【参考方案2】:

对于所有正在寻找答案的人,在 Mongodb 论坛上发布了一个问题,并且该答案得到了 Mongodb 相关人员的认可。

@kmgt 给出的答案是正确的。 可以安全地忽略该错误,并将在即将发布的 Mongodb Nodejs 驱动程序中修复,或者将 Mongoose 版本降级到 5.11.15 会有所帮助。

(node:44612) DeprecationWarning: Listening to events on the Db class has been deprecated and will be removed in the next major version

【讨论】:

【参考方案3】:

同样的错误

但据我所知,这是一个新版本的兼容性错误,在搜索了这个当前的错误版本后,我发现了这个comment session,根据其中一个,忽略这个警告是安全的。

【讨论】:

是的,但是这些警告(我在其他软件包中看到过类似的警告)在命令行上产生了很多噪音。【参考方案4】:

如果您使用的是 mongoose 版本 5.11.16 或更高版本,您将看到此错误。您可以通过将其降级到版本 5.11.15 来解决此问题。

npm 卸载猫鼬

npm i mongoose@5.11.15

尽管社区和许多评论部分对此进行了讨论,但由于存在兼容性错误,这是一个警告,忽略它可能没有害处。建议下次更新修复。

【讨论】:

【参考方案5】:

您可以使用猫鼬版本 5.11.13

【讨论】:

降级到 mongoose 5.11.15 就足够了。根据changelog“升级到mongodb驱动程序3.6.4”发生在5.11.16。【参考方案6】:

好的,所以我找到了解决此问题的方法。

任务:在 mongoDB 上将图像作为二进制数据上传,使用存储桶、块等。

Reference URL

代码:

const express = require("express");
const router = express.Router();
const User = require('../models/user');
const grid = require('gridfs-stream');
const GridFsStorage = require('multer-gridfs-storage');
const util = require("util");
const crypto = require('crypto');
const path = require('path');
const methodOverride = require('method-override');
const bodyParser = require('body-parser');
const dotenv = require("dotenv").config(path: "./config/config.env");
const multer = require('multer');


const storage = new GridFsStorage(
    url: process.env.MONGO_URI,

    options: 
        useUnifiedTopology: true
    ,
    file: (req, file) => 
        return new Promise((resolve, reject) => 
            crypto.randomBytes(16, (err, buf) => 
                if (err) 
                    return reject(err);
                
                const filename = buf.toString('hex') + path.extname(file.originalname);
                const fileInfo = 
                    filename: filename,
                    bucketName: 'uploads'
                ;
                resolve(fileInfo);
            );
        );
    


);
var uploadFile = multer(storage: storage).single("file");
var uploadFilesMiddleware = util.promisify(uploadFile);
module.exports = uploadFilesMiddleware;

问题:

已弃用警告监听 Db 类上的事件 已弃用,将在下一个主要版本中删除。

修复:

所以很可能问题不是因为你。它在包装本身中。 (查看上面的参考链接)

    转到 node_modules (这是一个包含很多文件的文件夹) 您的 node_js 应用程序中的文件夹。

    转到 multer-gridfs-storage(在 node_modules 内)

    转到 lib 文件夹(在 multer-gridfs-storage 中)

    打开 gridfs.js

    找到这条评论(//这是所有发出错误的事件)

    替换这个

    this.db .on('错误', errEvent) .on('parseError', errEvent) .on('超时', errEvent) .on('close', errEvent);

有了这个

this.client
    .on('error', errEvent)
    .on('parseError', errEvent)
    .on('timeout', errEvent)
    .on('close', errEvent);

基本上将“db”替换为“client”。

您也可以到官方页面查看当前的问题,其中明确提到 multer-gridfs-storage 存在碎片警告问题。

Issue Link

【讨论】:

以上是关于DeprecationWarning:监听 Db 类上的事件已被弃用,将在下一个主要版本中删除的主要内容,如果未能解决你的问题,请参考以下文章

在将 appium 作为 DeprecationWarning 运行之前,我有一个警告。它是啥?

DeprecationWarning 之后的“用户不允许执行操作”

DeprecationWarning 之后的“用户不允许执行操作”

Mongoose 警告:DeprecationWarning:当前的服务器发现和监控引擎已弃用?

如何确定地抑制 Python 中的 DeprecationWarning?

Linux下DB2监听服务怎么启动