17

如何解决 model.find() 函数产生“... ms 后缓冲超时”?我正在使用 mongoose v 5.11.0、npm v6.14.8 和 mongodb v

这是代码。

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
const assert = require('assert');

var mongoose = require('mongoose');

try {
    var db = mongoose.connect('mongodb://localhost:27017', {useNewUrlParser: true, dbName: 'swag-shop' });
    console.log('success connection');
}
catch (error) {
    console.log('Error connection: ' + error);
}


var Product = require('./model/product');
var WishList = require('./model/wishlist');

//Allow all requests from all domains & localhost
app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "POST, GET");
  next();
});

app.get('/product', function(request, response) {

    Product.find({},function(err, products) {
        if (err) {
            response.status(500).send({error: "Could not fetch products. "+ err});
        } else {
            response.send(products);
        }
    });
});

app.listen(3004, function() {
    console.log("Swag Shop API running on port 3004...");
});

产品型号:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var product = new Schema({
    title: String,
    price: Number,
    likes: {type: Number, default: 0}
});

module.exports = mongoose.model('Product', product);

此外,运行该文件还会产生以下警告:

D:\Test\swag-shop-api>nodemon server.js
[nodemon] 2.0.6
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
success connection
Swag Shop API running on port 3004...
(node:28596) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received type function ([Function (anonymous)])
    at validateString (internal/validators.js:122:11)
    at Url.parse (url.js:159:3)
    at Object.urlParse [as parse] (url.js:154:13)
    at module.exports (D:\Test\swag-shop-api\node_modules\mongoose\node_modules\mongodb\lib\url_parser.js:15:23)
    at connect (D:\Test\swag-shop-api\node_modules\mongoose\node_modules\mongodb\lib\mongo_client.js:403:16)
    at D:\Test\swag-shop-api\node_modules\mongoose\node_modules\mongodb\lib\mongo_client.js:217:7
    at new Promise (<anonymous>)
    at MongoClient.connect (D:\Test\swag-shop-api\node_modules\mongoose\node_modules\mongodb\lib\mongo_client.js:213:12)
    at D:\Test\swag-shop-api\node_modules\mongoose\lib\connection.js:820:12
    at new Promise (<anonymous>)
    at NativeConnection.Connection.openUri (D:\Test\swag-shop-api\node_modules\mongoose\lib\connection.js:817:19)
    at D:\Test\swag-shop-api\node_modules\mongoose\lib\index.js:345:10
    at D:\Test\swag-shop-api\node_modules\mongoose\lib\helpers\promiseOrCallback.js:31:5
    at new Promise (<anonymous>)
    at promiseOrCallback (D:\Test\swag-shop-api\node_modules\mongoose\lib\helpers\promiseOrCallback.js:30:10)
    at Mongoose._promiseOrCallback (D:\Test\swag-shop-api\node_modules\mongoose\lib\index.js:1135:10)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:28596) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:28596) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我尝试增加bufferTimeoutMS或禁用bufferCommands但它仍然不起作用。

4

13 回答 13

22

根据在此链接中找到的文档:https ://mongoosejs.com/docs/connections.html#buffering

Mongoose 让您可以立即开始使用模型,而无需等待 mongoose 与 MongoDB 建立连接。

那是因为猫鼬在内部缓冲了模型函数调用。这种缓冲很方便,但也是一个常见的混淆来源。如果您使用未连接的模型,Mongoose 默认不会抛出任何错误。

TL;博士:

在建立连接之前调用您的模型。您需要将async/await与 connect() 或 createConnection() 一起使用;或使用.then() ,因为这些函数现在从Mongoose 5返回承诺。

于 2021-01-10T07:07:51.473 回答
7

关于model.find() 错误的问题:操作products.find()缓冲在 10000 毫秒后超时”通过删除 node_module 文件夹、*.json 文件并重新安装 mongoose 模块得到解决。

按照此说明解决了警告问题https://mongoosejs.com/docs/deprecations.html

于 2020-12-02T06:16:31.563 回答
5

好吧,我遇到了同样的问题并且有非常相似的代码。在测试时发送获取请求时,我遇到了同样的错误。

最终,我找到了我的本地主机数据库当时没有运行的解决方案。虽然这是一个愚蠢的错误,但我很难找到它。

于 2021-01-26T13:56:57.820 回答
4

对我来说是 100% 的 MongoDB Atlas 问题。我在圣保罗创建了一个集群,由于某种原因没有按预期工作。我已经删除了它,在 AWS / N. Virginia (us-east-1) 中创建一个新的,一切又开始工作了。

我正在使用此功能连接到数据库并避免一些警告

mongoose.connect(
    url,
    { useNewUrlParser: true, useUnifiedTopology: true },
    function (err, res) {
        try {
            console.log('Connected to Database');
        } catch (err) {
            throw err;
        }
    });
于 2021-04-01T17:56:40.377 回答
4

出现此错误是因为您在创建与数据库的连接之前尝试访问模型

始终通过以下方式在 app.js 中链接您的 mongodbconnection 文件(如果已创建)

 var mongoose = require('./mongoconnection');

或者只是在 app.js 中保留 mongodb 连接代码

于 2021-03-02T18:36:18.563 回答
1

我有同样的问题。

经过长时间的搜索,我能够找到它。

我在 MongoDB 地图集设置中创建了一个新用户。我用新用户更改了 MongoDB 连接值。

将 DNS 设置更改为 8.8.8.8 或将 mongodb 连接设置更改为 2.2.12 均无效。

于 2021-11-25T19:31:48.243 回答
0

mongoose v5 中发生了变化,意大利面条代码已被重构,它现在返回一个解析为 mongoose 单例的承诺。所以你不必这样做。

// You don't have todo this
mongoose.connect('mongodb://localhost:27017/test').connection.
  on('error', handleErr).
  model('Test', new Schema({ name: String }));

// 您现在可以改为执行此操作

mongoose.connect('mongodb://localhost:27017/test').catch(err);

在此处查看参考资料 Mongoose v5 中的新功能^

如果这对您不起作用,您可以更改您的连接 URL > 选择您的驱动程序和版本到 v2.2.12 或更高版本

于 2021-03-31T13:36:02.523 回答
0

最好的方法是将初始化放在一个函数中,在启动服务器之前连接到 db。使用 async 和条件的组合来检查环境变量是否存在(如果 db url 在 env 中)这是一个示例代码。

const start = async () => {
    
    if (!process.env.DB_URI) {
        throw new Error('auth DB_URI must be defined');
    }
    try {
        await mongoose.connect(process.env.DB_URI!, {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useCreateIndex: true,
        });
        console.log('Server connected to MongoDb!');
    } catch (err) {
        throw new DbConnectionError();
        console.error(err);
    }

    const PORT = process.env.SERVER_PORT;
    app.listen(PORT, () => {
        console.log(`Server is listening on ${PORT}!!!!!!!!!`);
    });
};

start();

于 2021-07-14T13:35:52.773 回答
0

我只在部署的 lambda 函数上遇到了这个问题,并且在我的本地上一切正常。以下对我有用。

  1. 删除 node_modules 文件夹。
  2. npm 安装
  3. 提交/推送新的 package-lock.json 文件
  4. 合并/运行 cicd 管道/部署。
于 2021-08-10T08:09:15.213 回答
0

首先,您应该检查当前运行的端口 mongodb。

使用此命令检查该端口

sudo lsof -iTCP -sTCP:LISTEN | grep mongo

如果在那里你发现不同的端口而不是 27017,你应该改变它

于 2021-05-29T18:41:46.463 回答
0

对我来说,问题是节点版本。我在使用 nodejs 版本 17 时遇到了同样的错误。在尝试了这个线程上的所有建议之后,偶然发现了这个未解决的问题。尝试降级节点,但没有奏效,最终将节点17完全卸载并安装节点16,问题解决!您可以使用在 Mac 上检查您的节点版本node --version

于 2021-12-08T05:10:27.630 回答
0

在我的情况下,我忘记在 server.js 文件中导入 db.config 文件

于 2021-02-19T16:42:39.873 回答
0

如果您的 mongodb 密码有任何特殊字符,那么您必须对其进行百分比编码https://www.urlencoder.org/使用此工具。

于 2021-08-25T20:34:38.027 回答