如何使用ExpressJS通过https提供网页服务?

3

我是nodejs/expressjs的新手。请问有谁能够解释一下如何通过https来提供网页服务?

我必须换一种方式来询问这个问题,因为stackoverflow抱怨我的帖子主要是代码?

以下是错误信息:

app.get('/', function(request, response) {
    ^

TypeError: 对象#没有方法'get',位于Object.(/home/john/startup/docm/w2.js:21:5),在Module._compile(module.js:456:26)时发生,在Object.Module._extensions..js(module.js:474:10)处,在Module.load(module.js:356:32)时加载,在Function.Module._load(module.js:312:12)中运行,在Function.Module.runMain(module.js:497:10)中启动,在node.js:119:16中启动,在node.js:901:3中执行。
var express = require('express');
var   fs = require('fs');
var app = express();

var options = {
    ca:   fs.readFileSync('csr.pem'),
    cert: fs.readFileSync('cert.pem'),
    key:  fs.readFileSync('key.pem')
};


var server = require('https').createServer(options);
var portNo = 8889;
var app = server.listen(portNo, function() {
  console.log((new Date()) + " Server is listening on port " + 8888);
});

app.get('/', function(request, response) {
 app.use(express.static(__dirname));
 console.log('app.get slash');
 var buf = new Buffer(fs.readFileSync('index1.html'), 'utf-8');
 response.send(buf.toString('utf-8'));

});

我刚接触nodejs/expressjs。有人能解释一下如何通过https提供页面吗?


在创建了Express应用程序之后,请勿重新定义变量app:var app = server.listen(...) - WiredPrairie
这里也有文档记录:http://expressjs.com/api.html - WiredPrairie
1个回答

3
你的应用程序存在问题,是因为你正在使用HTTPS实例覆盖了Express实例。以下是正确的做法:
var fs = require('fs');
var express = require('express');
var app = express();
var https = require('https');

var options = {
  ca: fs.readFileSync('csr.pem'),
  cert: fs.readFileSync('cert.pem'),
  key: fs.readFileSync('key.pem')
};

var server = https.createServer(options, app);
server.listen(443, function() {
  console.log((new Date()) + ' Server is listening on port 443');
});

app.use(express.static(__dirname));
app.get('/', function(req, res) {
 console.log('app.get slash');
 var file = fs.readFileSync('index1.html', {encoding: 'utf8'});
 res.send(file);
});

以下是您代码中的错误内容:

  1. 您没有将Express传递给HTTPS,而是用HTTPS实例覆盖了Express。
  2. 您没有将Express应用程序传递给HTTPS实例。
  3. Express的static()中间件应在特定请求处理程序之外提供服务。
  4. 您传递一个缓冲区到另一个缓冲区以设置其编码,尽管readFileSync()已经具有编码选项。

谢谢你的帮助。我很喜欢人们愿意分享和帮助那些经验不足的人入门的方式。我会将你的答案与我尝试的方式进行比较,以确保我完全理解我的错误在哪里。再次感谢。 - user2744514
1
我尝试了这个,虽然服务器运行了。但我无法让它提供index1.html页面。我的客户端浏览器只是坐在那里,最终可能过了1分钟后,它会显示“服务器未找到”(Firefox)或“未接收到数据”(Chrome)。 我可以创建一个HTTP服务器。但我的HTTPS服务器无法提供页面。我不知道我的知识差距在哪里。这是我需要在客户端上配置的东西吗? openssl genrsa -out server-key.pem 1024 openssl req -new -key server-key.pem -out server-csr.pem openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem - user2744514
我已经把它搞定了。再次感谢你的帮助,我非常感激。 - user2744514

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接