作为客户端,当 运行 连接到 NodeJS 应用程序的 MongoDB 服务器时,我应该连接到哪个端口?

As a client, what port am I supposed to connect to when running a MongoDB server that is connected to a NodeJS app?

我的本地网络上有两个端口 运行 用于服务器:27017 是 MongoDB 的端口,3000 是我的 nodejs 应用程序的端口。然后,我在监听端口 3000 时使用 mongoose connect 连接两者。

var db = mongoose.connect('mongodb://localhost/test')

app.listen(3000, () => {
   console.log('listening on port 3000')
})

之前我试图通过网络浏览器使用 http://(server ip):27017 连接到服务器,但是我在 NodeJS 应用程序中编写的 GET 永远不会被调用。

app.get('/', (req, res) => {
   res.send('hello world')
})

我将端口切换到 3000,http://(server ip):3000 最后我的 GET 得到了响应。

这就是客户端连接到服务器的方式吗?通过他们的 nodejs 应用程序而不是数据库?在将 TLS 与 HTTP 结合使用时,客户端是否也应该连接到 nodejs 应用程序?

浏览器客户端应连接到您的网络服务器,而不是数据库,因此 你上面的例子,那将是在端口 3000 上。

So is this how clients should be connecting to their servers? Through their nodejs app and not to the database?

是的。数据库是供您的服务器使用的,而不是供客户端直接使用的。任何客户端与数据库的交互都是通过您的服务器间接发生的。

Should clients also connect to the nodejs app when using TLS with HTTP?

如果服务器 运行 在本地仅使用 localhost 访问它,则可能不需要 https。

这几天一般推荐给运行public服务器上https。这意味着您将从 Let's Encrypt 等证书颁发机构获得证书,并在一般方案中使用 https.createServer() 和 https 凭据选项,例如来自 Let's Encrypt 网站的示例:

// Dependencies
const fs = require('fs');
const https = require('https');
const express = require('express');

const app = express();

// Certificate
const privateKey = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem', 'utf8');
const certificate = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/cert.pem', 'utf8');
const ca = fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/chain.pem', 'utf8');

const credentials = {
    key: privateKey,
    cert: certificate,
    ca: ca
};

app.use((req, res) => {
    res.send('Hello there !');
});

// Starting https server
const httpsServer = https.createServer(credentials, app);

httpsServer.listen(443, () => {
    console.log('HTTPS Server running on port 443');
});

请注意,您通常会 运行 端口 443 上的 https 服务器。然后,您将使用 https 协议而不是 http 连接到该服务器。如果您使用 443(https 的默认端口号),则无需在浏览器中指定端口 URL,但如果不使用端口 443,则需要指定端口。