【问题标题】:Routing on NodeJS ExpressNodeJS Express 上的路由
【发布时间】:2018-09-07 09:09:31
【问题描述】:

我在 NodeJS 中用 Express 开发一个服务器,但是 web 结构有点复杂(我没做过,也改不了)。

流程是这样的:

  1. 节点服务器收到类似https://localhost/**{id}**的调用。
  2. 收到的 ID 是所有文件(html、js、css、 等)被存储。默认返回index.html
  3. 任何网站的文件结构都没有严格的逻辑,这意味着在index.html 所在的同一级别或文件夹中可以有更多视图,无论客户想在哪里开发它们。

我遇到的问题是如何正确路由文件。由于我仅在调用索引时才收到 ID,因此我无法弄清楚如何路由 <a href="view1.html">View 1</a> 之类的链接,甚至 javascript 文件调用 <script src='scripts/someGreatFunctions.js'></script> 因为它们也可能位于根目录或文件夹中(甚至同时做两件事)。

我的server.js 文件:

const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();

const config = require('./config');

var webId;

var options = {
  key: fs.readFileSync(config.paths.certificate.key),
  cert: fs.readFileSync(config.paths.certificate.crt),
  requestCert: false,
  rejectUnauthorized: false
};

app.use(function (req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
  res.setHeader("Access-Control-Allow-Headers", "Accept, Access-Control-Allow-Headers, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Content-Type, Origin, X-Requested-With");
  next();
});

app.get('/scripts/:script', function(req, res) {
  res.sendFile(req.params.script, {root: config.paths.webs + webId + '/scripts'});
});

app.get('/:script.js', function(req, res) {
  res.sendFile(req.params.script + '.js', {root: config.paths.webs});
});

// This routes correctly the index
app.get('/:id', function(req, res) {
  webId = req.params.id;
  res.sendFile('index.html', {root: config.paths.webs + webId});
});

// This DID NOT work
app.get('/:id/:page', function(req, res) {
  //Some code here...
});

https.createServer(options, app).listen(443, function() {
  console.log("NodeJS secure server started at port 443");
});

【问题讨论】:

    标签: javascript node.js express url-routing


    【解决方案1】:

    我也处于学习阶段。希望这会有所帮助。

    app.get('/test/:id/:page', function(req, res, next) {
        let id = req.params.id;
        let page = req.params.page;
        console.log('The id: ' + id);
        console.log('The page: ' + page);
    });
    

    【讨论】:

    • 我试过了,但没用。 URL 的第一部分,你在其中放置/test/对我来说是 dinamic,所以它不一样。感谢您的回复!
    【解决方案2】:

    我终于得到了答案。似乎声明gets 的顺序非常重要。另外,我使用了一个正则表达式使其更通用。

    /**
     * HTTP GET for files (.html, .js, etc.) from another folder level
     */
    app.get('/:id/:folder/:file', function(req, res) {    
      if (typeof(webId) === undefined) {
        webId = req.params.id; 
      }
      let folder = req.params.folder;
      let file = req.params.file;
    
      res.sendFile(file, {root: config.paths.webs + webId + '/' + folder});
    });
    
    /**
     * HTTP GET for .js files from the base path
     */
    app.get(/\/\w+.\b(js)/, function(req, res) {
      let lastBar = req.url.lastIndexOf('/');
      let script = req.url.substr(lastBar);
    
      res.sendFile(script, {root: config.paths.webs});
    });
    
    /**
     * HTTP GET for index page
     */
    app.get('/:id', function(req, res) {
      webId = req.params.id;
      res.sendFile('index.html', {root: config.paths.webs + webId});
    });
    
    /**
     * HTTP GET for view from base path
     */
    app.get('/:id/:page', function(req, res) {
      if (typeof(webId) === undefined) {
        webId = req.params.id; 
      }
      let page = req.params.page;
    
      res.sendFile(page, {root: config.paths.webs + webId});
    });
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2014-10-03
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多