node.js - Mongoose 查询在 Windows 10 上完美运行,但在 Ubuntu 18.04 上挂起
问题描述
语境
我开发了一个 React 系统,登录由分发 JWT 令牌的 API 处理。我已经在 Windows 10 上开发了所有内容,并将其部署在 EC2 Ubuntu 18.04 LTS 单元上。
问题
该 API 在 Express 上运行。该应用程序能够在 Windows 和 Linux 上建立数据库连接(托管在 MongoDB Atlas 上)(即使在 Linux 上需要更长的时间)。但是,该应用程序无法进行查询。find 或 findOne 函数都没有提供任何反馈,但它们在我的 Windows 机器上运行良好。
相关代码
代码如下:
应用程序.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 无关)工作得很好。
解决方案
我的问题实际上非常简单......我注意到我的 readystate 为 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 白名单中。
推荐阅读
- oracle - Oracle表设计题:配置表、默认值、主键
- cognos - 日期 <> 当前日期
- c++ - Ruby 和指针与其他语言相比?
- java - 如何在网格窗格的间隙之间对齐一条线?
- ios - 如何在 Swift 编程中修复 NSInternalInconsistencyException
- excel - 尝试使用日历小部件采取条件操作
- php - 正则表达式在 preg_match 函数中的工作方式不同
- javascript - Force open A Selectpicker Programmatically by Javascript
- javascript - 为什么将插槽视为作用域插槽时此激活器文本会消失?
- javascript - 在新选项卡上保留输入值