Маршрутизация на NodeJS Express - PullRequest
0 голосов
/ 07 сентября 2018

Я разрабатываю сервер в NodeJS с Express, но веб-структура немного усложняется (я этого не делал и не могу изменить).

Потокчто-то вроде этого:

  1. Узловый сервер получает вызов типа https://localhost/**{id}**.
  2. Полученный идентификатор - это имя папки, в которой хранятся все файлы (html, js, css и т. д.),По умолчанию он возвращает index.html.
  3. Файловая структура любого веба не имеет строгой логики, это означает, что может быть больше представлений на том же уровне, что и у index.html или в папках, где бы ни находились клиентыхотел разработать их.

У меня проблема в том, как правильно направить файлы.Поскольку я получаю идентификатор только тогда, когда индекс вызывается, я не могу понять, как маршрутизировать ссылки, такие как <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");
});

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я наконец получил ответ. Похоже, очень важен порядок, в котором объявлено 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});
});
0 голосов
/ 07 сентября 2018

Я тоже на этапе обучения. Надеюсь, это поможет.

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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...