Nodejs服务器不响应客户端的get请求



我使用的是NodejS客户端和服务器应用程序,它们都运行在同一个Ubuntu虚拟机上。我设法让他们通过TLS连接工作。问题是我无法使我的服务器应用程序以理想的方式响应。例如,当客户端向服务器发送路径选项param1时,服务器应该以value1进行响应,但这种情况不会发生。我犯了一个错误。你能提出解决这个问题的简单方法吗?如果没有安全性,当客户端是网络浏览器时,我可以从服务器获得所需的响应。

当服务器正在运行并且我运行客户端时,我得到以下错误:

events.js:183
throw er; // Unhandled 'error' event
^
Error: connect ENOENT /param1
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)

我的客户是:

const tls = require('tls');
const fs = require('fs');
const https = require("https")
const options = {
key: fs.readFileSync('cl.key.pem'),
cert:fs.readFileSync('cl.cert.pem'),
ca: fs.readFileSync('ca.cert.pem'), 
passphrase:'1111',
hostname:'localhost',
port:8000,
path: '/param1',
method: 'GET'
};
var socket = tls.connect(8000, 'localhost', options, () => {
console.log('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.on('data', (data) => {
console.log(data);
});
socket.on('end', () => {
console.log('Ended')
});
const req = https.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});

我的服务器是:

const tls = require('tls');
const fs = require('fs');
const express = require ('express')
var bodyParser = require('body-parser');
const options = {
key: fs.readFileSync('host.key.pem'),
cert: fs.readFileSync('host.cert.pem'),
requestCert: true,
ca:fs.readFileSync('ca.cert.pem'),
passphrase: '1111',
};
const server = tls.createServer(options, (socket) => {
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized')
});
server.listen(8000, () => {
console.log('server bound');
});
const app = express()
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
const port = 8000
app.get('/x',(req,res) => {
o="";
if(req.params.x == "param1") {
o = "value1";
}
else if(req.params.x == "param2") {
o = "value2";
}
else if(req.params.x == "param3") {
o = "value3";
}
res.status(200).send('${req.params.x} is ${o}');})
app.post('/getinfo',(req,res)=>res.status(200).send(`Thank you       
${req.body.name} for adding yourself to our database`))

您在代码中混淆了TLS和HTTPS。

如果您只需要一个安全的客户端-服务器通信,则不必使用HTTPS和express。您可以通过socket发送和接收数据。

如果您需要支持web请求,请不要创建TLS服务器,而是使用HTTPS并将您的express应用程序插入HTTPS服务器:

var express = require('express')
var fs = require('fs')
var https = require('https')
var app = express()
https.createServer({
key: fs.readFileSync('cl.key.pem'),
cert: fs.readFileSync('cl.cert.pem')
}, app)
.listen(8000, function () {
console.log('listening on port 8000')
})

理论上,您可以有两个服务器,一个只运行TLS,另一个运行HTTPS,但它们需要在不同的端口上启动。

最新更新