Apollo Engine能否监听Node.js HTTPS服务器?遇ERR_SSL_PROTOCOL_ERROR问题
Apollo Engine支持Node.js HTTPS服务器吗?当然支持!你的ERR_SSL_PROTOCOL_ERROR问题大概率是配置细节没做对。
首先确认你的HTTPS服务器本身配置没问题
先确保你已经用合法的证书和密钥创建了HTTPS服务器,示例代码如下:const https = require('https'); const fs = require('fs'); // 替换成你的证书和密钥路径 const httpsOptions = { key: fs.readFileSync('./private-key.pem'), cert: fs.readFileSync('./certificate.pem') }; // 创建HTTPS服务器 const httpsServer = https.createServer(httpsOptions);正确关联Apollo Engine和HTTPS服务器的两种方式
你之前的代码同时指定了port和httpServer,这是冲突点——因为你的HTTPS服务器已经是一个绑定了端口的服务(或者你应该让Apollo Engine直接处理HTTPS配置):- 方式一:传入已有的HTTPS服务器(不要指定port参数)
engine.listen({ httpServer: httpsServer, // 这里不要加port,因为httpsServer已经配置好端口了 }); // 记得启动你的HTTPS服务器(如果之前没启动的话) httpsServer.listen(3000); - 方式二:让Apollo Engine直接创建HTTPS服务
如果你不想手动创建HTTPS服务器,可以直接把HTTPS配置传给engine.listen:engine.listen({ port: 3000, https: httpsOptions // 这里传入你的证书密钥配置 });
- 方式一:传入已有的HTTPS服务器(不要指定port参数)
为什么会出现ERR_SSL_PROTOCOL_ERROR?
这个错误最常见的原因是端口上的服务类型不匹配:- 如果你给
engine.listen同时传了httpServer(HTTPS类型)和port,Apollo Engine可能会在该端口额外启动一个HTTP服务,导致你用HTTPS请求访问时,服务器返回的是HTTP响应,自然触发SSL协议错误。 - 另外也可以检查下:你是不是用
https://去访问了一个实际运行HTTP服务的端口?比如之前不小心启动了HTTP服务在3000端口,没关掉就又启动了HTTPS服务,导致端口冲突。
- 如果你给
快速验证步骤
- 先单独启动你的HTTPS服务器,访问
https://localhost:3000,确认能正常加载(自签名证书会提示不安全,但能进入页面就说明服务器没问题)。 - 再整合Apollo Engine,按上面的正确方式配置,重启服务后再次用HTTPS访问。
- 先单独启动你的HTTPS服务器,访问
内容的提问来源于stack exchange,提问作者Marcel Rösler
相关产品推荐
相关产品推荐

