#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. К сожалению, это не сработало, но спасибо за вашу помощь.