【问题标题】:How to use route for html file already served as static如何为已用作静态的 html 文件使用路由
【发布时间】:2018-12-23 02:44:17
【问题描述】:

在用户进入登录页面后,我使用 passport.js 对用户进行身份验证。为了让用户在返回主页时保持登录状态,我将使用以下内容:

app.use(express.static(__dirname + '/public'));

app.get('/', function(req,res){
   if(req.user){
   // connect to database ....
} else{
    res.sendFile(__dirname +'/index.html');
   }
});

请注意,index.html 文件位于“public”文件夹中。最近我意识到有了上面这样的代码,node.js 不使用 app.get('/'....) 路由,但它直接为 index.html 提供服务。所以我无法检查 req.user 是否存在。有什么建议吗?

【问题讨论】:

  • 教你节点和护照很长。只看教程:youtube.com/watch?v=DGTvjcgWt00
  • 我认为提供一个小答案比建议观看视频 1.33h...
  • 好的。 1. 我要举例说明如何使用中间件, 2. 我要展示如何创建本地策略,然后使用它的中间件, 3. 我要修复你的代码。总计:你只会复制粘贴它,什么也不会学到。 1.3小时的视频就是一个例子,搜索短片。你们这些人都懒得学了。你甚至不想看官方手册:passportjs.org/docs/downloads/html为什么别人必须为你做你的工作?
  • youtube.com/… Traversy Media 解释得更好
  • 如果您想始终提供 html 文件。您只需将文件响应移出else 部分。 app.get('/', (req, res) => { if (req.uses) {/*do something*/} res.sendFile(__dirname + '/public/index.html'); }); 太简单太基础了,无法理解。

标签: node.js passport.js


【解决方案1】:

正如您可能理解的那样,express.static 在您的路由器之前处理 index.html。

但是你也不能避免 express.static (否则你必须使用 nginx 或编写自己的静态文件输出)。

所以你必须重新考虑你的文件夹结构或必须开发 2 个独立的应用程序:api(后端)和前端(将请求 api 获取数据)

在您的问题的上下文中,我编写了一个示例应用程序,我在其中组织资产、html 文件和应用程序路由:

1) 有这样的文件夹结构:

2) 和示例app.js

'use strict';

const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');

app.set('trust proxy', 1);

// attaching renderer
app.engine('.html', require('ejs').renderFile); // ejs renderer will render .html files as ejs files
app.set('view engine', 'html');          // views has .html extension
app.set('views', __dirname + '/public'); // views live in public folder

// attaching common middlewares
app.use('/assets', express.static('public/assets')); // our static assets will live in public/assets folder
app.use(cookieParser());
app.use(bodyParser());


// implement and attach passport auth somewhere (:
// remove it after passport has been attached:
const authorizeUser = (req, res, next) => {
  req.user = {id: 1, username: 'test'};
  next();
};

app.get('/', authorizeUser, (req, res) => {
  res.render('index', {user: req.user});  // render get index.html from views folder (see above)
});

app.listen(8080, () => {
  console.log('App listening');
});



p.s.下载示例应用程序from here(不要忘记在提取的文件夹中调用npm i (;)

附言自己实现passport.js

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2022-11-13
    • 2011-05-08
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多