Node.js服务器不响应客户端获取请求

时间:2018-11-10 06:32:28

标签: node.js json rest

我正在使用运行在同一Ubuntu虚拟机上的NodejS客户端和服务器应用程序。我设法让他们通过TLS连接工作。问题是我无法使服务器应用程序以令人满意的方式响应。例如,当客户端向服务器发送路径选项param1时,服务器应以value1进行响应,但这不会发生。我得到一个错误。您能否提出解决此问题的简单方法?没有安全性,当客户端是Web浏览器时,我可能会从服务器获得期望的响应。

服务器正在运行并且运行客户端时,出现以下错误:

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`))

1 个答案:

答案 0 :(得分:1)

您正在代码中混合使用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')
})

从理论上讲,您可以有2台服务器,其中一台仅运行TLS,一台在HTTPS上,但是它们需要在不同的端口上启动。