MongoDB 部署在 Raspberry Pi 使用 SSL 在 Nodejs 服务器上超时
MongoDB Deployed on Raspberry Pi Timing out on Nodejs Server with SSL
我最近在 raspberry pi 上部署了我的 nodejs 服务器和 mongoDb,一切正常,但 mongoDB 请求超时。我相信错误与 ssl 有关,因为当我删除 SSL 时它工作正常。
我向服务器发出的任何 api 请求出现的错误是:
{"message":"Operation `users.findOne()` buffering timed out after 10000ms"}
我的 mongodb 连接字符串是:
"connectionString":"mongodb://username:password@127.0.0.1:27017?authSource=dbWithUserCredentials&compressors=zlib&retryWrites=true&w=majority&ssl=true"
服务器中的连接代码是:
mongoose.connect(process.env.MONGODB_URI || config.get('connectionString'), {useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true},(err,client)=>{
if (err) return console.error(err);
console.log('Connected to database');
});
我的 server.js 是:
require('rootpath')();
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
var path = require('path');
var exec = require('exec');
const jwt = require('./clover-server-backend/_helpers/jwt');
const errorHandler = require('./clover-server-backend/_helpers/error-handler');
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./src/assets/ssl_key.txt'),
cert: fs.readFileSync('./src/assets/sll.com.crt'),
ca: fs.readFileSync ('./src/assets/ssl.com.ca-bundle')
};
app.use(express.static(__dirname + '/dist/softServer', { dotfiles: 'allow' }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.use(cors());
// app.get('/*', function(req,res) {
//
// res.sendFile(path.join(__dirname+'/dist/softServer/index.html'));
// });
// use JWT auth to secure the api
app.use('/api/*', jwt());
// api routes
app.use('/api/users', require('./clover-server-backend/users/users.controller'));
app.use('/api/categories', require('./clover-server-backend/categories/categories.controller'));
app.get('/*', function(req,res) {
res.sendFile(path.join(__dirname+'/dist/softServer/index.html'));
});
// global error handler
app.use(errorHandler);
// start server
console.log('In server.js'); //*MES*
const port = process.env.NODE_ENV === 'production' ? 443 : 4000;
var server = https.createServer(options, app);
server.listen(port, () => {
console.log("server starting on port : " + port)
});
function execCallback(err,stdout, stderr){
if(stdout){
console.log(stdout)
}
if(stderr){
console.log(stderr)
}
}
确保您的数据库连接代码在您的 server.js 而不是外部文件中
如果它在外部文件中,请确保在 server.js 中调用它,否则它不会连接到数据库
你不需要你的 mongoose 连接功能是吗?它不在您的 server.js.
中
findOne
命令超时,因为没有活动连接。
findOne 会排队等待您的服务器连接,如果没有活动连接,它就会超时。
您需要请求连接文件,或者在您的 server.js
中调用 mongoose connect
我最近在 raspberry pi 上部署了我的 nodejs 服务器和 mongoDb,一切正常,但 mongoDB 请求超时。我相信错误与 ssl 有关,因为当我删除 SSL 时它工作正常。
我向服务器发出的任何 api 请求出现的错误是:
{"message":"Operation `users.findOne()` buffering timed out after 10000ms"}
我的 mongodb 连接字符串是:
"connectionString":"mongodb://username:password@127.0.0.1:27017?authSource=dbWithUserCredentials&compressors=zlib&retryWrites=true&w=majority&ssl=true"
服务器中的连接代码是:
mongoose.connect(process.env.MONGODB_URI || config.get('connectionString'), {useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true},(err,client)=>{
if (err) return console.error(err);
console.log('Connected to database');
});
我的 server.js 是:
require('rootpath')();
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
var path = require('path');
var exec = require('exec');
const jwt = require('./clover-server-backend/_helpers/jwt');
const errorHandler = require('./clover-server-backend/_helpers/error-handler');
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./src/assets/ssl_key.txt'),
cert: fs.readFileSync('./src/assets/sll.com.crt'),
ca: fs.readFileSync ('./src/assets/ssl.com.ca-bundle')
};
app.use(express.static(__dirname + '/dist/softServer', { dotfiles: 'allow' }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.use(cors());
// app.get('/*', function(req,res) {
//
// res.sendFile(path.join(__dirname+'/dist/softServer/index.html'));
// });
// use JWT auth to secure the api
app.use('/api/*', jwt());
// api routes
app.use('/api/users', require('./clover-server-backend/users/users.controller'));
app.use('/api/categories', require('./clover-server-backend/categories/categories.controller'));
app.get('/*', function(req,res) {
res.sendFile(path.join(__dirname+'/dist/softServer/index.html'));
});
// global error handler
app.use(errorHandler);
// start server
console.log('In server.js'); //*MES*
const port = process.env.NODE_ENV === 'production' ? 443 : 4000;
var server = https.createServer(options, app);
server.listen(port, () => {
console.log("server starting on port : " + port)
});
function execCallback(err,stdout, stderr){
if(stdout){
console.log(stdout)
}
if(stderr){
console.log(stderr)
}
}
确保您的数据库连接代码在您的 server.js 而不是外部文件中 如果它在外部文件中,请确保在 server.js 中调用它,否则它不会连接到数据库
你不需要你的 mongoose 连接功能是吗?它不在您的 server.js.
中findOne
命令超时,因为没有活动连接。
findOne 会排队等待您的服务器连接,如果没有活动连接,它就会超时。
您需要请求连接文件,或者在您的 server.js
中调用 mongoose connect