Переменная не передается в Pug

#javascript #node.js #express #pug

#javascript #node.js #выразить #pug

Вопрос:

Я создаю express.js приложение как часть командного проекта. Я новичок в javascipt, но задача в конечном итоге выпала на мою долю. Цель соответствующего кода — запустить скрипт при нажатии кнопки, используя некоторые пользовательские параметры, затем отобразить новую страницу и отобразить ссылки на отчеты, которые были сгенерированы на странице результатов. По какой-то причине это никогда не срабатывает в первый раз после запуска приложения, но это сработает, если вы вернетесь и повторите попытку. Я думал, что возникла проблема с синхронизацией, и она может быть, но, похоже, также существует проблема с тем, что переменные массива не передаются в pug. Я неделями бился головой об стол и обратился за помощью к моему профессору (никто из нас не является CS-специалистом), но безуспешно. Пожалуйста, помогите.

Вот переменные приложения, конфигурация и т. Д. в начале файла:

 // index.js

/**
 * Required External Modules
 */

const express = require("express");
const path = require("path");
const shell = require("shelljs");
const fs = require("fs");






/**
 * App Variables
 */

const app = express();
const port = process.env.PORT || "8000";
var ipAddresses;
var ipAddressesLink;








/**
 *  App Configuration
 */

app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");
app.use(express.static(path.join(__dirname, "public")));
app.use(express.static(path.join(__dirname, "reports/html")));

//code to make html forms work
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));
  

Вот соответствующий маршрут, который продолжает меня подводить:

 //Run script when post is rec'd from root and send to results page
app.post("/", (req, res) => {
    //take values and create complete command for Astrum script
    var commandString = 'bash /home/astrum/Main/Astrum.sh -s '   req.body.speed   ' -h '   req.body.host   ' -u '   req.body.username   ' -p '   req.body.password;
    var pathToReports = './reports/html';
  
    runScript(commandString);

    readFolder(pathToReports);
    
    renderPage();
    
    
    //Iterate thru filenames to create arrays for links and link labels
    function readFolder(pathValue) {

        fs.readdir(pathValue, (err, files) => {

            console.log(files)
                
            //variable amp; method for links to html records pages
            ipAddressesLink = files;

            console.log(ipAddressesLink);
            
            //variable and method to remove file extension for link labels in pug
            ipAddresses = files.map(removeExtension);

            
        });

    }

    //function to remove last five characters of each element
    function removeExtension(value) {

        return value.substring(0, value.length - 5);

    };

    //function to render the page
    function renderPage() {

        res.render("results", {ipAddressesLink, ipAddresses, title: 'Results'});

    }

    //function to execute command in shell
    function runScript(value) {

        shell.exec(value);

    }


    //show array on console for debugging
    console.log("type of record is: "   typeof ipAddressesLink);
    console.log(ipAddressesLink);
    console.log(ipAddresses);

    res.end();
});
  

Вот шаблон pug для страницы результатов, который выдает ошибку, очевидно, что работа продолжается:

 extends layout

block layout-content
  
  div.View
    
    div.Message
      
      div.Title
        
        h1 Astrum Network Analysis
      
        div.Body          
          
          div.multiple-group
          
            h3 Heading
            select(id='whitelist', name='whitelist' size='6' multiple)
              option(value="volvo") Volvo
              option(value="saab") Saab
              option(value="fiat") Fiat
              option(value="audi") Audi
              option(value="bmw") BMW


          div.form-group

            label(for='whitelistButton')
            input(type='submit' value='Whitelist Ports')


          h3 Hosts Found:  
            
            ul

              each val, index in ipAddressesLink

                li: a( href = val ) #{ipAddresses[index]}
  

И вот сообщение об ошибке, которое я получаю:

 TypeError: /home/astrum/Main/astrumApp/views/results.pug:36
    34|             ul
    35| 
  > 36|               each val, index in ipAddressesLink
    37| 
    38|                 li: a( href = val ) #{ipAddresses[index]}
    39| 

Cannot read property 'length' of undefined
    at eval (eval at wrap (/home/astrum/Main/astrumApp/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:93:32)
    at eval (eval at wrap (/home/astrum/Main/astrumApp/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:116:4)
    at template (eval at wrap (/home/astrum/Main/astrumApp/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:119:7)
    at Object.exports.renderFile (/home/astrum/Main/astrumApp/node_modules/pug/lib/index.js:452:38)
    at Object.exports.renderFile (/home/astrum/Main/astrumApp/node_modules/pug/lib/index.js:442:21)
    at View.exports.__express [as engine] (/home/astrum/Main/astrumApp/node_modules/pug/lib/index.js:491:11)
    at View.render (/home/astrum/Main/astrumApp/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/astrum/Main/astrumApp/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/astrum/Main/astrumApp/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/astrum/Main/astrumApp/node_modules/express/lib/response.js:1012:7)
  

Комментарии:

1. Вы уверены, что файлы не пустые? Что все же выводится на console.log(ipAddressesLink) печать?

Ответ №1:

Вы должны использовать fs.readdirSync ! Я уверен fs.readdir , что in readFolder function не соответствует вашему ожидаемому порядку обработки:

 function readFolder(pathValue) {

    //variable amp; method for links to html records pages
    ipAddressesLink = fs.readdirSync(pathValue);

    //variable and method to remove file extension for link labels in pug
    ipAddresses = ipAddressesLink.map(removeExtension);

}
  

Комментарии:

1. Прибил его! Спасибо!

Ответ №2:

Попробуйте изменить:

  //function to render the page
function renderPage() {

    res.render("results", {ipAddressesLink, ipAddresses, title: 'Results'});

}
  

Для:

  //function to render the page
function renderPage() {

    res.render("results", {ipAddressesLink: ipAddressesLink, ipAddresses: ipAddresses, title: 'Results'});

}
  

Комментарии:

1. К сожалению, это не сработало, но спасибо за вашу помощь.