Javascript 我能';t调用使用Node.JS在另一个函数中创建的函数
此代码的我的目标:此代码应随机生成一个数学方程,用户应在其中输入结果(用户认为正确的结果)。然后,计算机应将用户输入的输入(结果)与实际结果进行比较。如果结果是正确的,它应该控制台日志(“好”),如果它是不正确的,它应该控制台日志(“坏”),无论哪种方式,在点击提交按钮后,网站应该刷新并随机生成一个新的等式(该过程会重复一次) 问题:我有一个函数Javascript 我能';t调用使用Node.JS在另一个函数中创建的函数,javascript,node.js,ejs,Javascript,Node.js,Ejs,此代码的我的目标:此代码应随机生成一个数学方程,用户应在其中输入结果(用户认为正确的结果)。然后,计算机应将用户输入的输入(结果)与实际结果进行比较。如果结果是正确的,它应该控制台日志(“好”),如果它是不正确的,它应该控制台日志(“坏”),无论哪种方式,在点击提交按钮后,网站应该刷新并随机生成一个新的等式(该过程会重复一次) 问题:我有一个函数equationGenerator,它生成随机方程并计算结果。我需要在应用程序中调用equationGenerator。在node.js中获取函数,以便
equationGenerator
,它生成随机方程并计算结果。我需要在应用程序中调用equationGenerator
。在node.js中获取
函数,以便每次刷新网站时都会出现一个新函数,不幸的是,该函数没有被调用,我现在尝试加载网站时只会出错
代码如下:
////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");
}
});
<!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>
以下是ejs代码:
////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");
}
});
<!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>
数学教育
数学
=
提交
如果你有什么困惑,我会非常乐意回答任何问题,因为我已经尝试解决这个问题好几天了
非常感谢你
这里是下载到WetTransfer-中完整文件的链接。请确保使用app1.1.js进行试用,我有很多版本,但这是当前版本
如果你有什么困惑,我会非常乐意回答任何问题,因为我已经尝试解决这个问题好几天了
非常感谢你 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想知道在生成页面时如何“保存”
结果
,以便以后在表单中包含用户条目提交时将其与提交的结果进行比较
无状态解决方案(不在服务器上跨请求存储中间状态)通常是可取的(如果可行)。我可以想出两种无状态的解决方案
结果
,并将其与用户的结果进行核对
express session
保存用户状态。在该用户状态中可以是一个Map
对象,该对象包含formID、result
的键、值对。提交表单时,从表单中取出formID,在用户的会话对象中查找预期结果,然后将提交的结果与预期结果进行比较。您需要一些方案来老化用户从未使用过的会话对象中的formID(因为他们从未提交表单,或者因为他们多次点击refresh生成了一堆从未使用过的formID)
这里没有使用equationGenerator()的返回值
请尝试以下操作:
app.get("/", function(request, response){
response.render("index.ejs", equationGenerator());
});
equationGenerator`返回一个对象,但您不使用它。我希望将equationGenerator'中的数据传输到以下对象中:response.render(例如firstNumber),这在app.get中。因此,您引用返回的对象
const eg=equationGenerator();控制台日志(如firstNumber)
@epascarello是的,我确实希望在app.get中使用该对象,因为我希望它出现在我的index.ejs中file@ggorlen我刚刚更新了问题,提供了所有您需要的帮助,我还提供了文件的下载链接,感谢您提醒我。对不起,给我几秒钟,我正在查看答案并尝试,顺便说一句,谢谢。不过我想确保它与我的ejs元素兼容。嘿,谢谢你的努力,不幸的是代码一直在产生错误。我在我的问题中添加了更多的信息,甚至还有一个文件的下载链接,app1.1.js就是我正在使用的文件,如果你愿意的话请看一下(我使用Atom编辑器)。@WiseEye-当你说“不断产生错误”时,这没有多大帮助。我们需要确切地知道什么错误(确切的错误文本),确切地知道错误来自什么代码。这是基本的调试。我不会检查您的整个项目,并试图找出可能导致错误的原因。您需要向我们显示确切的错误以及导致该错误的代码,然后我们可以帮助诊断可能导致该错误的原因。我给你看了