Сервер не слушает экспресс

avatar
Jake
8 августа 2021 в 18:30
49
1
1

Я создаю экспресс-проект, чтобы сделать "Flask" в nodejs. Но почему-то совсем не слушается. В консоли отображается listening on *:8080, но страница не отображается. Код:

index.js

const { Flask, render_template } = require('./flask');
const app = Flask(__dirname);

app.route('/',()=>render_template('index.html'),);

app.run(8080,'0.0.0.0',(p,h)=>{
  console.log('\nlistening on *:'+p)
});

flask.js

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

let request = {
  cookies: {
    get: (cookie)=>{},
    obj: {}
  },
  headers: {}
}

app.use((req,res)=>{
  const headers = req.headers;
  delete headers.host;
  delete headers['user-agent'];
  delete headers.accept;
  delete headers['accept-encoding'];
  delete headers['accept-language'];
  delete headers['if-none-match'];
  delete headers['referer'];
  delete headers['sec-ch-ua'];
  delete headers['sec-ch-ua-mobile'];
  delete headers['sec-ch-ua-platform'];
  delete headers['sec-fetch-dest'];
  delete headers['sec-fetch-mode'];
  delete headers['sec-fetch-site'];
  delete headers['sec-fetch-user'];
  delete headers['upgrade-insecure-requests'];
  delete headers['x-forwarded-for'];
  delete headers['x-forwarded-proto'];
  request.headers = headers;
});
function readdir(dirname, onFileContent, ) {
  fs.readdir(dirname,function(err, filenames) {
    onFileContent(filenames);
  });
};
function isDir(path) {
  try {
    var stat = fs.lstatSync(path);
    return stat.isDirectory();
  } catch (e) {
    return false;
  }
}
app.use(require('cookie-parser')())
if(fs.existsSync('static')){
  app.use(express.static('static'))
};

app.use((req,res,next)=>{
  let entr = Object.entries(req.cookies);
  for(var i=0;i<entr.length;i++){
    if(typeof(entr[i][1])=='object'){
      entr[i][1] = JSON.stringify(entr[i][1]);
    }
    request.cookies.obj[entr[i][0]] = entr[i][1];
  }
});

function setErrorStatus(code, callback){
  if(!file){
    app.use((err,req,res,next)=>{
      const status = res.statusCode;
      res.status(status==200?500:code);
      callback({
        redirect: (loc)=>{res.redirect(loc);next()},
        send_file: (fileName)=>{res.sendFile(fileName);next()}
      });
    });
  };
}

function route(dir,call,method="GET"){
  if(method == 'GET'){
    app.get(dir,(req,res)=>{
      res.send(call());
    });
  } else if (method == 'POST'){
    app.post(dir,(req,res)=>{
      res.send(call());
    });
  } else if (method == 'ALL'){
    app.all(dir,(req,res)=>{
      res.send(call());
    });
  } else {
    app.get(dir,(req,res)=>{
      res.send(call())
    })
  }
};

function render_template(file){
  try{
    return fs.readFileSync(__dirname+'/templates/'+file,'utf8')
  } catch (e) {
    let htii;
    console.error(`Error: ENOENT\nNo file/dir called "templates/${file}.`);
    process.exit(73);
  }
}

function run(port=8080,host='0.0.0.0',callback=()=>{}){
  app.listen(port,host='0.0.0.0');
  return callback(port, host);
}

function flask(){
  return {
    route: route,
    run: run,
    // on: appon
  }
}

function send_file(
fileName_or_fp,
as_download = false
){
  if(res == null){ return; };
  if(as_download){
    res.download(fileName_or_fp);
  } else {
    res.render(fileName_or_fp);
  }
}
module.exports = {
  Flask: flask,
  render_template: render_template,
  request: request
}

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My Page</title>
</head>
<body>
  <p>Flask Loaded!</p>
</body>
</html>

Когда я загружаю его в первый раз, он показывает пустую страницу, хотя должен показывать файл /templates/index.html после загрузки.

Что я пробовал:

  • удаление и повторная установка экспресс-анализатора и анализатора файлов cookie
  • экспресс протестирован на index.js
  • сделал копию того же проекта .

Пожалуйста, помогите.

Примечание. Это не дубликат другого вопроса.

Источник
Kelvin Schoofs
8 августа 2021 в 18:36
0

Нет (неотловленных) ошибок в вашем выводе? Я почти уверен, что ваш обратный вызов app.run всегда вызывается, поскольку вы не передаете обратный вызов для обработки ошибок (Express) app.listen.

Jake
8 августа 2021 в 18:38
0

@KelvinSchoofs Ошибок нет, и я думаю, что это, вероятно, проблема app.route, поскольку app.listen выглядит совершенно нормально

Kelvin Schoofs
8 августа 2021 в 18:40
0

Я заметил, что вы добавили, что app.get('/', ...) каждый раз и дважды для вашего тестового сервера, но я думаю, Express должен справиться с этим?

Jake
8 августа 2021 в 18:42
0

Я делал это, чтобы протестировать сервер, и я забыл удалить его, когда копировал код.

Ответы (1)

avatar
Kelvin Schoofs
8 августа 2021 в 18:45
1

Согласно документации по промежуточному ПО, ваше промежуточное ПО получает третий аргумент, функцию next, которую вы должны вызвать для передачи запроса следующему промежуточному ПО или обработчику конечного маршрута. Например:

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

В вашем первом app.use, где вы удаляете эти заголовки, вы не принимаете этот аргумент, поэтому Express перестает делать что-либо после промежуточного программного обеспечения, в том числе не отправлять ответ.

Kelvin Schoofs
8 августа 2021 в 18:51
0

Похоже, что промежуточное ПО для файлов cookie также не вызывает next().

Jake
8 августа 2021 в 18:53
0

Я попытался удалить cookie-parser, но все равно не работает :\

Kelvin Schoofs
8 августа 2021 в 19:06
0

Я имел в виду ваш пользовательский app.use несколькими строками ниже, где вы повторяете req.cookies и тому подобное, а не require('cookie-parser')().