首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Nodejs中通过Express将每个视图更改为https

如何在Nodejs中通过Express将每个视图更改为https
EN

Stack Overflow用户
提问于 2017-04-21 09:07:25
回答 2查看 379关注 0票数 1

嗨,我对NodeJS中的每个视图都有问题。目前,我正在使用车把作为服务器端模板。例如,要呈现视图,我访问的每个路由都是res.render(loginDir, {login: false, admin: false, header: "Welcome!!"}); http://blablabla。我希望它是https://blablabla。请提前帮我处理this...thanks

以下是我的代码:

Uiroutes.ts

代码语言:javascript
运行
AI代码解释
复制
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;

上面的vars仅供文件参考.hbs视图目录。

代码语言:javascript
运行
AI代码解释
复制
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');

In my server.ts

代码语言:javascript
运行
AI代码解释
复制
//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);

编辑:

以下是服务器端的cert配置,以便使用https

In server.ts

代码语言:javascript
运行
AI代码解释
复制
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);
});

我们的服务器是云,所有的应用程序都部署在那里。很难说那是什么样的服务器.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-21 10:10:34

您可以尝试将所有路由HTTP重定向到HTTPS。

在所有路由之前添加一行:

代码语言:javascript
运行
AI代码解释
复制
app.get('*', (req, res, next) => {
   if(req.headers['x-forwarded-proto'] !== 'https') {
     res.redirect('https://' + req.headers.host + req.url);
   }
   next();
});

如果请求是http,则检查头,如果是http,您是否将用户重定向到https。

票数 0
EN

Stack Overflow用户

发布于 2017-04-21 13:30:57

您可以使用快递-强制-ssl,它将为您处理此问题:

代码语言:javascript
运行
AI代码解释
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43548415

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文