Node.js 如何在Nodejs中通过Express对每次视图更改进行https
嗨,我有一个问题,以https在NodeJS的每一个单一的看法。目前我使用手柄作为服务器端模板。要呈现视图,例如,Node.js 如何在Nodejs中通过Express对每次视图更改进行https,node.js,express,typescript,routes,Node.js,Express,Typescript,Routes,嗨,我有一个问题,以https在NodeJS的每一个单一的看法。目前我使用手柄作为服务器端模板。要呈现视图,例如,res.render(loginDir,{login:false,admin:false,header:“Welcome!!”}) 我访问的每条路线都是。我希望它是。请帮我做这个…提前谢谢 以下是我的代码: Uiroutes.ts import express = require('express'); import path = require('path'); var app
res.render(loginDir,{login:false,admin:false,header:“Welcome!!”})代码>
我访问的每条路线都是。我希望它是。请帮我做这个…提前谢谢
以下是我的代码:
Uiroutes.ts
import express = require('express');
import path = require('path');
var app = express();
class Uiroutes {
get uiroutes() {
var rootManageDir = path.join(__dirname,'../../../client/management/manage');
var rootExecutionDir = path.join(__dirname,'../../../client/execution/execution');
var rootUserHomeDir = path.join(__dirname,'../../../client/userhome/userhome');
var loginDir = path.join(__dirname,'../../../client/login/login');
app.get('/management',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootManageDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/execution',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootExecutionDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/userhome', this.userAuth, (req: express.Request, res: express.Response) => {
let header = req.body.username + ', Welcome back!';
res.render(rootUserHomeDir, {login: true, admin: false, header: header});
});
app.get('/login', (req: express.Request, res: express.Response) => {
res.render(loginDir, {login: false, admin: false, header: "Welcome!!"});
});
app.get('/logout', this.logout, (req: express.Request, res: express.Response) => {
res.redirect('/login');
});
return app;
}
userAuth(req, res, next) {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
res.redirect('/management');
} else {
res.redirect('/login');
}
}
}
adminAuth(req, res, next) {
//console.log(req.session);
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
res.redirect('/userhome');
} else {
res.redirect('/login');
}
}
}
logout(req, res, next) {
if(req.session["user"]){
console.log("logged in");
delete req.session["user"];
console.log(req.session["user"]);
next();
} else {
delete req.session;
next();
}
}
}
export = Uiroutes;
//Set view engine
app.set('view engine', 'hbs');
var defaultDir = path.join(__dirname, '../client/layout/default');
var layoutDir = path.join(__dirname, '../client/layout');
var viewpath = path.join(__dirname, '../client')
//Config the view engine
app.engine('hbs', hbs.express4({
defaultLayout: defaultDir,
layoutsDir: layoutDir
}));
//config view path
app.set('views', viewpath);
app.use(new UIRoutes().uiroutes);
const fs = require('fs');
var app = require('../server').app;
const https = require('https');
var ip = '0.0.0.0';
var port = 8443;
var privateKey = fs.readFileSync('/opt/epaas/certs/key');
var certificate = fs.readFileSync('/opt/epaas/certs/cert');
var ca = fs.readFileSync('/opt/epaas/certs/ca');
var pass = fs.readFileSync('/opt/epaas/certs/pass','ascii');
var options = {
key: privateKey,
cert: certificate,
ca: ca,
passphrase: pass,
requestCert: true,
rejectUnauthorized: false
};
var server = https.createServer(options, app);
server.listen(port, function(){
console.log('This app is listening on port:' + port);
});
上面的vars
仅用于文件引用.hbs视图目录
var rootManageDir = path.join(__dirname,'../../../client/management/manage');
var rootExecutionDir = path.join(__dirname,'../../../client/execution/execution');
var rootUserHomeDir = path.join(__dirname,'../../../client/userhome/userhome');
var loginDir = path.join(__dirname,'../../../client/login/login');
在我的服务器中。ts
import express = require('express');
import path = require('path');
var app = express();
class Uiroutes {
get uiroutes() {
var rootManageDir = path.join(__dirname,'../../../client/management/manage');
var rootExecutionDir = path.join(__dirname,'../../../client/execution/execution');
var rootUserHomeDir = path.join(__dirname,'../../../client/userhome/userhome');
var loginDir = path.join(__dirname,'../../../client/login/login');
app.get('/management',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootManageDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/execution',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootExecutionDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/userhome', this.userAuth, (req: express.Request, res: express.Response) => {
let header = req.body.username + ', Welcome back!';
res.render(rootUserHomeDir, {login: true, admin: false, header: header});
});
app.get('/login', (req: express.Request, res: express.Response) => {
res.render(loginDir, {login: false, admin: false, header: "Welcome!!"});
});
app.get('/logout', this.logout, (req: express.Request, res: express.Response) => {
res.redirect('/login');
});
return app;
}
userAuth(req, res, next) {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
res.redirect('/management');
} else {
res.redirect('/login');
}
}
}
adminAuth(req, res, next) {
//console.log(req.session);
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
res.redirect('/userhome');
} else {
res.redirect('/login');
}
}
}
logout(req, res, next) {
if(req.session["user"]){
console.log("logged in");
delete req.session["user"];
console.log(req.session["user"]);
next();
} else {
delete req.session;
next();
}
}
}
export = Uiroutes;
//Set view engine
app.set('view engine', 'hbs');
var defaultDir = path.join(__dirname, '../client/layout/default');
var layoutDir = path.join(__dirname, '../client/layout');
var viewpath = path.join(__dirname, '../client')
//Config the view engine
app.engine('hbs', hbs.express4({
defaultLayout: defaultDir,
layoutsDir: layoutDir
}));
//config view path
app.set('views', viewpath);
app.use(new UIRoutes().uiroutes);
const fs = require('fs');
var app = require('../server').app;
const https = require('https');
var ip = '0.0.0.0';
var port = 8443;
var privateKey = fs.readFileSync('/opt/epaas/certs/key');
var certificate = fs.readFileSync('/opt/epaas/certs/cert');
var ca = fs.readFileSync('/opt/epaas/certs/ca');
var pass = fs.readFileSync('/opt/epaas/certs/pass','ascii');
var options = {
key: privateKey,
cert: certificate,
ca: ca,
passphrase: pass,
requestCert: true,
rejectUnauthorized: false
};
var server = https.createServer(options, app);
server.listen(port, function(){
console.log('This app is listening on port:' + port);
});
编辑:
以下是服务器端的证书配置,以便使用https
在server.ts中
import express = require('express');
import path = require('path');
var app = express();
class Uiroutes {
get uiroutes() {
var rootManageDir = path.join(__dirname,'../../../client/management/manage');
var rootExecutionDir = path.join(__dirname,'../../../client/execution/execution');
var rootUserHomeDir = path.join(__dirname,'../../../client/userhome/userhome');
var loginDir = path.join(__dirname,'../../../client/login/login');
app.get('/management',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootManageDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/execution',this.adminAuth, (req: express.Request, res: express.Response) => {
res.render(rootExecutionDir, {login: true, admin: true, header: "Admin, Welcome back!"});
});
app.get('/userhome', this.userAuth, (req: express.Request, res: express.Response) => {
let header = req.body.username + ', Welcome back!';
res.render(rootUserHomeDir, {login: true, admin: false, header: header});
});
app.get('/login', (req: express.Request, res: express.Response) => {
res.render(loginDir, {login: false, admin: false, header: "Welcome!!"});
});
app.get('/logout', this.logout, (req: express.Request, res: express.Response) => {
res.redirect('/login');
});
return app;
}
userAuth(req, res, next) {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
res.redirect('/management');
} else {
res.redirect('/login');
}
}
}
adminAuth(req, res, next) {
//console.log(req.session);
if(req.session["user"]&&(req.session["user"].role == 'admin')) {
req.body.username = req.session["user"].username;
next();
} else {
if(req.session["user"]&&(req.session["user"].role == 'user')) {
req.body.username = req.session["user"].username;
res.redirect('/userhome');
} else {
res.redirect('/login');
}
}
}
logout(req, res, next) {
if(req.session["user"]){
console.log("logged in");
delete req.session["user"];
console.log(req.session["user"]);
next();
} else {
delete req.session;
next();
}
}
}
export = Uiroutes;
//Set view engine
app.set('view engine', 'hbs');
var defaultDir = path.join(__dirname, '../client/layout/default');
var layoutDir = path.join(__dirname, '../client/layout');
var viewpath = path.join(__dirname, '../client')
//Config the view engine
app.engine('hbs', hbs.express4({
defaultLayout: defaultDir,
layoutsDir: layoutDir
}));
//config view path
app.set('views', viewpath);
app.use(new UIRoutes().uiroutes);
const fs = require('fs');
var app = require('../server').app;
const https = require('https');
var ip = '0.0.0.0';
var port = 8443;
var privateKey = fs.readFileSync('/opt/epaas/certs/key');
var certificate = fs.readFileSync('/opt/epaas/certs/cert');
var ca = fs.readFileSync('/opt/epaas/certs/ca');
var pass = fs.readFileSync('/opt/epaas/certs/pass','ascii');
var options = {
key: privateKey,
cert: certificate,
ca: ca,
passphrase: pass,
requestCert: true,
rejectUnauthorized: false
};
var server = https.createServer(options, app);
server.listen(port, function(){
console.log('This app is listening on port:' + port);
});
我们的服务器是一个云,所有的应用程序都部署在那里。很难说是哪种类型的服务器…您可以尝试使用HTTP到HTTPS的所有路由重定向
在所有管线之前添加一条线,包括:
app.get('*', (req, res, next) => {
if(req.headers['x-forwarded-proto'] !== 'https') {
res.redirect('https://' + req.headers.host + req.url);
}
next();
});
如果请求是http,则检查标头。如果是http,则将用户重定向到https。您可以尝试使用所有路由http重定向到https
在所有管线之前添加一条线,包括:
app.get('*', (req, res, next) => {
if(req.headers['x-forwarded-proto'] !== 'https') {
res.redirect('https://' + req.headers.host + req.url);
}
next();
});
如果请求是http,则检查标头。如果是http,则将用户重定向到https。您可以使用以下选项来处理此问题:
const fs = require('fs');
const https = require('https');
const http = require('http');
const express = require('express');
const express_enforces_ssl = require('express-enforces-ssl');
const app = express();
/*
* Trust proxy must be set if you're behind a reverse proxy / load balancer
*
*/
app.enable('trust proxy');
app.use(express_enforces_ssl());
/*
* Then you have to make sure your express server can handle https
*/
http.createServer(app).listen(80);
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(443);
您可以使用将为您处理此问题的:
const fs = require('fs');
const https = require('https');
const http = require('http');
const express = require('express');
const express_enforces_ssl = require('express-enforces-ssl');
const app = express();
/*
* Trust proxy must be set if you're behind a reverse proxy / load balancer
*
*/
app.enable('trust proxy');
app.use(express_enforces_ssl());
/*
* Then you have to make sure your express server can handle https
*/
http.createServer(app).listen(80);
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(443);
谢谢你的解决方案。但是我应该在哪里插入这个代码片段呢?很好,Mathers?它确实将我重定向到https URL,但我无法访问视图。我将在我们的开发服务器上测试它,看看……它可能在那里工作:)它不完全适用于我的情况。。。每次我通过res.render(…)
切换到另一个路由时,它就变成了http。但若我进入地址栏并点击回车键,它会将我重定向到https…谢谢你们的解决方案。但是我应该在哪里插入这个代码片段呢?很好,Mathers?它确实将我重定向到https URL,但我无法访问视图。我将在我们的开发服务器上测试它,看看……它可能在那里工作:)它不完全适用于我的情况。。。每次我通过res.render(…)切换到另一个路由时,它就变成了http。但若我进入地址栏并点击回车键,它会将我重定向到https…你们有你们的域的证书吗?我只是想问问以防万一。。最好不要让HTTPS进入您的节点应用程序,并使用像NGINX这样的反向代理来处理域路由和HTTPS。我会写一个更详细的答案,但如果你先告诉我们你使用的是什么服务器/服务(DigitalOcean+Ubuntu/Azure/Heroku…。@Erik Cupal他们在服务器端使用证书,那就容易多了。我将粘贴证书配置。请参见编辑。@Erik Cupal我们的服务器是一个云平台,所有应用程序都部署在那里。所以很难说这是什么类型的服务器…你有你的域的证书吗?我只是想问问以防万一。。最好不要让HTTPS进入您的节点应用程序,并使用像NGINX这样的反向代理来处理域路由和HTTPS。我会写一个更详细的答案,但如果你先告诉我们你使用的是什么服务器/服务(DigitalOcean+Ubuntu/Azure/Heroku…。@Erik Cupal他们在服务器端使用证书,那就容易多了。我将粘贴证书配置。请参见编辑。@Erik Cupal我们的服务器是一个云平台,所有应用程序都部署在那里。所以很难说是什么样的服务器…它不完全适合我的情况。。。每次我通过res.render(…)切换到另一个路由时,它就变成了http。但是如果我进入地址栏并点击回车键,它会将我重定向到https..你必须将enfroce ssl放在任何其他中间件之前,你这样做了吗?不是所有中间件,我只是将其放在所有路由之前…让我尝试一下,它不起作用,因为你在不同于443的端口中使用https。你支持负载平衡器吗?@Mathers那么,你得到了什么结果?它对我的情况不完全有效。。。每次我通过res.render(…)切换到另一个路由时,它就变成了http。但是如果我进入地址栏并点击回车键,它会将我重定向到https..你必须将enfroce ssl放在任何其他中间件之前,你这样做了吗?不是所有中间件,我只是将其放在所有路由之前…让我尝试一下,它不起作用,因为你在不同于443的端口中使用https。你在负载均衡器后面吗?@Mathers那么,你得到了什么结果?