Mongoose 查询在 Windows 10 上运行完美,但在 Ubuntu 18.04 上挂起

Mongoose query works perfect on Windows 10, but hangs on Ubuntu 18.04

上下文

我开发了一个 React 系统,登录由分发 JWT 令牌的 API 处理。我已经在 Windows 10 上开发了所有内容,我将把它部署在 EC2 Ubuntu 18.04 LTS 单元上。

问题

快递上的API运行。该应用程序能够在 Windows 和 Linux 上建立数据库连接(托管在 MongoDB Atlas 上)(即使在 Linux 上需要更长的时间)。但是,该应用程序无法进行查询。 find 或 findOne 函数都没有给出任何反馈,而它们在我的 Windows 机器上运行得非常好。

相关代码

代码如下:

App.js

const createError = require('http-errors');
const express = require('express');
const app = express();
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const cors = require('cors');
const mongoose = require('mongoose');
const dotenv = require('dotenv');

dotenv.config();

//Connect to DB
mongoose.connect(process.env.DB_CONNECT, {useNewUrlParser: true, useUnifiedTopology: true}, () => {
    console.log("Connected to DB!");
});

//Import routes
...
const authentication = require('./routes/Auth');
...

//Middleware
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

//Route middleware
...
app.use('/auth', authentication);
...

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

app.listen(3003, () => {
    console.log("server is up and running");
});
module.exports = app;

Auth.js

const router = require('express').Router();
const User = require('../model/user');

const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const {registerValidation, loginValidation} = require('../model/Validation');

...

router.post('/login', async (req, res) => {
    //Validate the data
    const {error} = loginValidation(req.body);
    if(error) return res.status(400).send(error.details[0].message);

    //Check if exists
    //Application fails here
    const user = await User.findOne({email: req.body.email}, function (err) {console.log(err)});
    if(!user) return res.status(400).send('Email or password is wrong');

    //Check if password is correct
    const validPass = await bcrypt.compare(req.body.password, user.password);
    if(!validPass) return res.status(400).send('Email or password is wrong');

    //Create and assign a token
    const token = jwt.sign({_id: user._id}, process.env.TOKEN_SECRET, { expiresIn: 60 * 240});
    res.header('auth-token', token).send(token);
})

...

module.exports = router;

user.js(模型)

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        max: 255
    },
    email: {
        type: String,
        required: true,
        max: 255
    },
    password: {
        type: String,
        required: true,
        max: 1024,
        min: 6
    },
    date: {
        type: Date,
        default: Date.now
    }
});

module.exports = mongoose.model('User', userSchema);

我做了什么

我的目标

我希望能够在我的 Linux Ubuntu VPS 上 运行 API 以便我可以部署实际的 React 应用程序。现在登录显然不起作用。 API 中的所有其他端点(有很多功能/端点,但这些与登录端点或 MongoDB 无关)都工作得很好。

实际上我的问题非常简单...我注意到我的就绪状态为 0,所以我将以下行添加到我的 App.js 文件中以查看到底出了什么问题:

//Connect to DB
mongoose.connection.on('open', function (ref) {
    console.log('Connected to mongo server.');
});
mongoose.connection.on('error', function (err) {
    console.log('Could not connect to mongo server!');
    console.log(err);
});
mongoose.connect(process.env.DB_CONNECT, {useNewUrlParser: true, useUnifiedTopology: true}, () => {
    console.log("Connected to DB!");
}).then(r => console.log(r.connections));

在那之后,我注意到我的连接已关闭并且出现了 TransientTransactionError。

解决方法

好吧,我只是忘了将新服务器上的 IP 地址添加到我的 IP 白名单中。