我无法使用Node.JS调用在另一个函数内部创建的函数

时间:2020-07-27 23:27:47

标签: javascript node.js ejs

此代码的目标:该代码应随机生成一个数学方程式,用户应在其中输入结果(用户认为正确的结果)。然后,计算机应获取用户输入的输入(结果)并将其与实际结果进行比较。如果结果正确,则应控制台日志(“良好”),如果结果不正确,则应控制台日志(“不良”),无论哪种方式,单击“提交”按钮后,网站均应刷新并随机生成新的等式(并再次重复该过程。)

问题:我具有函数equationGenerator,该函数生成随机方程并计算结果。我需要在node.js的equationGenerator函数内调用app.get,以便每次刷新网站时都会出现一个新函数,不幸的是该函数没有被调用,尝试时我现在得到了错误加载网站。

以下是代码:

////Installations (not the actual code)

const bodyParser = require("body-parser");
const express = require("express");
const ejs = require("ejs");

const app = express();

app.set('view engine', 'ejs');

app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));


 ////The actual code

function equationGenerator(){

 var random = Math.round(Math.random() * 1);

 var firstNumber = random ? (Math.random() * (10000) - 5000).toFixed(2) : (Math.round(Math.random() * (100)) - 50);
 var secondNumber = random ? (Math.random() * (10000) - 5000).toFixed(2) : (Math.round(Math.random() * (100)) - 50);
 var operations = random ? ["+", "-"] : ["*", "/"];

 var randomOperation = operations[Math.round(Math.random() * 1)];
 var expression = firstNumber + randomOperation + secondNumber;
 var resultNotInterger = eval(expression);
 var result = Number(resultNotInterger).toFixed(2);

 return {
  firstNumber,
  secondNumber,
  randomOperation,
  result,
 };
}



app.get("/", function(request, response){
 equationGenerator()
 response.render("index.ejs", {
 firstNumber: firstNumber,
 secondNumber: secondNumber,
 randomOperation: randomOperation,
 result: result
 });
});

app.post("/", function(request, response){
 const clientResponse = Number(request.body.clientResponse).toFixed(2);
 if (clientResponse === result){
    console.log("Good");
    }else{
    console.log("Bad");
    }
response.redirect("/");
});

/////Server start code

app.listen(2109, function(err){
if (err){
console.log(err + "JHGKGFKUYGLUYFLIFYGUFYOIY:GYP");
}else{
console.log("Running on port 2109");
 }
});

这是ejs代码:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Math Ecercise</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<h1>Math</h1>
<p><%= firstNumber %> <%= randomOperation %> <%= secondNumber %> = <%= 
result %></p>
<form class="" action="/" method="post">
   <div class="lediv">
  <input class="form-control" type="text" name="clientResponse" value="" placeholder="result" autocomplete="off">
  <button class="btn btn-primary btn-info" type="submit" name="button">Submit</button>
  </div>
  <p class="message">Haha</p>
</form>
</body>
</html>

如果有什么让您感到困惑的事情,我将很乐意回答任何问题,因为我已经尝试解决这个问题已有好几天了。

非常感谢您!

这是在wetransfer-select kendo dropdown using selenium python中下载到完整文件的链接。确保使用 app1.1.js 进行尝试。我有很多版本,但这是当前版本。

如果有什么让您感到困惑的事情,我将很乐意回答任何问题,因为我已经尝试解决这个问题已有好几天了。

非常感谢您!

2 个答案:

答案 0 :(得分:0)

equationGenerator()返回一个对象,因此它只是失去了你不分配该对象的任何东西。由于返回的对象与您要传递的response.render()完全匹配,因此您可以直接传递它:

app.get("/", function(request, response){
 const data = equationGenerator()
 response.render("index.ejs", data);
});

或者,甚至:

app.get("/", function(request, response){
 response.render("index.ejs", equationGenerator());
});

如果返回的对象与您要传递的对象不完全匹配,则可以将对象分配给变量,然后选择要传递的对象片段:

app.get("/", function(request, response){
 const data = equationGenerator()
 response.render("index.ejs", {
     firstNumber: data.firstNumber, 
     secondNumber: data.secondNumber,
     randomOperation: data.randomOperation,
     result: data.result
 });
});

或者,您可以使用结构化分配来实现这一点,方法是分配给局部变量,然后使用这些值构建一个新对象:

app.get("/", function(request, response){
 const {
     firstNumber,
     secondNumber,
     randomOperation,
     result
 } = equationGenerator();

 response.render("index.ejs", {
     firstNumber, 
     secondNumber,
     randomOperation,
     result
 });
});

显然,由于返回的数据对象已经是您要传递给res.render()的对象,因此上面的第一个选项是最简单的。


问题的第二部分(在评论中),关于在表单发布后比较结果

OP希望知道在生成页面时如何“保存” result,以便将来以后在提交带有用户条目的表单时将其与提交的结果进行比较。

无状态解决方案(在请求中没有中间状态存储在服务器上)通常是可取的(在可行时)。我可以想到两个无状态的解决方案。

  1. 将输入数据与表单提交一起放入(作为隐藏字段,以便在提交表单时将它们发送回服务器),并在提交表单时在服务器上计算所需的结果。然后,您可以将用户结果与服务器计算的结果进行比较,而无需在任何地方“保存”预先计算的结果。

  2. 继续按照您的方式计算结果,但是对结果进行加密并将其放在表单中(作为隐藏字段),以便将其与答案一起提交给服务器。然后,当您收到POST表格时,对result进行解密,并与用户的结果进行核对。

也有非无状态解决方案。您可以为每个问题页面生成一个随机表单ID,并将其作为隐藏字段嵌入表单中,以便将其与表单一起提交。然后,您可以使用express-session保存用户状态。在该用户状态内可能是一个Map对象,其中包含formID,result的键值对。提交表单后,您将从表单中获取formID,在用户的会话对象中查找预期结果,然后将提交的结果与预期结果进行比较。您将需要一些方案来老化用户从未使用过的会话对象中的formID(因为他们从未提交过表单,或者因为他们多次单击刷新生成了一堆他们从未使用过的formID)。

答案 1 :(得分:0)

app.get("/", function(request, response){
 equationGenerator()
 response.render("index.ejs", {
 firstNumber: firstNumber,
 secondNumber: secondNumber,
 randomOperation: randomOperation,
 result: result
 });
});

您没有在其中使用equationGenerator()的返回值。

尝试以下操作:

app.get("/", function(request, response){
 response.render("index.ejs", equationGenerator());
});