首页 > 解决方案 > NodeJS为什么Mongoose会断开连接?(只有当我执行文件时才会提醒你)

问题描述

路线中的模式操作顺利进行。但是当我重用相同的代码(例如只是一个 find() 调用)并在文件中执行它('node test.js')时,我得到 - “MongooseError:操作refreshtokens.findOne()缓冲在 10000 毫秒后超时。”

所以我尝试检查 mongoose.connection.readyState,果然它等于 0(断开连接)。为什么?再说一次,mongoose.connection 从未在我的路线中被触及,我也从未遇到过任何问题(它仅在 server.js 中初始化)。

最终,我正在尝试创建一个我将安排的可执行文件,它需要访问数据库。

代码没有什么不寻常的(我不认为;) -

服务器.js

const express = require('express')
const app = express()
const mongoose = require('mongoose')

mongoose.connect(process.env.MONGODB_URI, {useNewUrlParser: true, useUnifiedTopology: true})
const db = mongoose.connection
db.on('error', (error) => console.error(error))
db.once('open', () => console.log('Connected to Database'))

...

./models/refreshtoken.js

const mongoose = require('mongoose')

const refreshTokenSchema = new mongoose.Schema({
    token: {
        type: String,
        required: true
    }
})

module.exports = mongoose.model('RefreshToken', refreshTokenSchema)

测试可执行文件 (test.js)

const RefreshToken = require('./models/refreshtoken.js'); 

const mongoose = require('mongoose');

(async () => {
    await testGetToken();
    console.log("ran testGetToken()");
})().catch(e => {
    // Deal with the fact the chain failed
    console.log(e)
});

async function testGetToken() {
    try {
        console.log("here in testGetToken() call")

        console.log("pre if mongoose.connection = " + mongoose.connection.readyState);
        if (mongoose.connection.readyState != 1) {
            await mongoose.connect(process.env.MONGODB_URI, {useNewUrlParser: true, useUnifiedTopology: true})
        }
        console.log("post if mongoose.connection = " + mongoose.connection.readyState);

        const token = await RefreshToken.find()
        console.log(token)
    } catch (err) {
        console.log("testGetToken() err = " + err)
    }
}

在我使用 await mongoose.connect 在 if 语句中添加之后,可执行文件将获取并打印令牌,但随后该过程不会结束(我必须 ctrl-c 两次)。为什么?(如顶部所述,没有 await mongoose.connect,我得到 MongooseError。)

最好知道的是为什么猫鼬有自己的想法并且只在我执行的文件中断开连接(以及如何纠正它)。在 server.js 中添加了 mongoose.connection.on('disconnected'...) 事件代码,它永远不会跳闸。

下一个最好的事情是,如果我们没有预料到在这样的过程中会产生任何有害影响,那么如何让可执行文件的进程关闭。我可以在这里做更多的功课,但我倾向于认为最好解决问题而不是忽略它们(请参阅:最好的事情)?:)

感谢您提供的任何帮助。谢谢你。

标签: node.jsmongoose

解决方案


它要么有一个你没有发现的错误,要么找不到一个。我遇到了同样的问题,就我而言,我滥用了 findOne() 并且它不匹配。尝试使用 mongo GUI 和 console.log() 来获取结果。


推荐阅读