разбор URL в express.js - PullRequest
       2

разбор URL в express.js

0 голосов
/ 29 апреля 2019

Я пытаюсь изучить файл express.js на моем сервере узлов и пытаюсь скопировать то же самое из модуля http в Express Framework.

дальнейшее объяснение: я использовал первый код до того, как начал использоватьExpress, в котором у меня есть файл filet в папке "site" с веб-страницами, такими как

e:
|_node.js
   |_node_modules
   |_site
   | |_abc
   | | |_123.html
   | | |_456.html
   | | |_789.html
   | |_cde
   | | |_123.html
   | | |_456.html
   | | |_789.html
   | |_abc.html
   | |_cde.html
   |_server.js

, и я обычно обращаюсь к ним в URL, просто используя localhost: 8080 / abc / 123 для получения / site / abc/123.html.

var http = require('http');
var url = require('url');
var fs = require('fs');
var port = 8080;

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "./site" + q.pathname + ".html";
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(port);
console.log('Running on port ' + port);

здесь, я попытался сделать это

var url = require('url');
var fs = require('fs');
var express = require('express');
var app = express();
var port = 8080;
var site = "/site"

app.get('*', function (req, res) {
  var q = url.parse(req.url, true);
  var filename = site + q.pathname + ".html";
    fs.readFile(filename, function(err, data) {
    if (err) {
      console.log(err);
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
      res.sendFile(filename, { root: __dirname + site } );
    return res.end();
  });
})

var server = app.listen(port, function () {
    console.log('Running on port ' + port);
})

, но теперь с помощью экспресс-фреймворка, когда я набираю localhost: 8080 / abc / 123, но он возвращает только 404Не найдено при наборе http://localhost:8080/abc

, очевидно, ошибка содержит

{[Error: ENOENT: no such file or directory, open 'e:\site\abc.html']
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'e:\\site\\abc.html'}

полный путь должен быть

e: \ node.js \ site \ abc.html

и server.js находится в e: \ node.js

почему он возвращается к e: чем к e: \ node.js

прямо сейчас яЯ предполагаю, что «root: __dirname» вызывает ошибку, что я должен заменить его, чтобы он начинался с e: /node.js, а неe:?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Изменение:

var site = "/site"

на:

var site = "site"

Корневые параметры применяются только к относительным именам файлов, но путь, начинающийся с '/', является абсолютным для корняфайловая система.

Если вам не нужно делать что-то большее с файлами, если вы только обслуживаете их, вероятно, лучше обслужить их с помощью express.static (), который можно настроить так, чтобы он не раскрывал .html.расширения, как здесь ответили:

https://stackoverflow.com/a/37990843/2106611

0 голосов
/ 29 апреля 2019

Возможно, это не единственная проблема, но одна вещь состоит в том, что

app.get('/', ... 

будет соответствовать только корневому URL, поэтому он будет соответствовать localhost:8080/, но не localhost:8080/foo или любому другому пути.

app.get принимает строку, шаблон пути или регулярное выражение .

Чтобы сопоставить что-либо вам нужно будет сделать:

app.get('/*', ... 

или если вы хотите сопоставить только пути, начинающиеся с определенного сегмента, вы можете сделать:

app.get('/some-path/*', ...

и это будет соответствовать localhost:8080/some-path/, localhost:8080/some-path/foo, localhost:8080/some-path/bar и т. Д.

Edit:

Что касается того, почему вы получаете неправильный путь к файлу, если вы посмотрите внимательно, вы увидите, что вы используете __dirname только при попытке отправить файл, но не когда вы ' перечитываю!

так что у вас есть:

var filename = site + q.pathname + ".html";
    // This is not reading from the correct path -
    // it's missing __dirname!
    fs.readFile(filename, function(err, data) {

который, вероятно, должен измениться на

var filename = __dirname + site + q.pathname + ".html";
    // This is now using __dirname which should be the
    // the directory of your server module
    fs.readFile(filename, function(err, data) {

Тогда далее вам не нужно использовать sendFile, поскольку у вас уже есть data в переменной, вы можете использовать код, подобный вашему примеру:

res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...