【问题标题】:Passing a javascript array through HTML form to another js file通过 HTML 表单将 javascript 数组传递给另一个 js 文件
【发布时间】:2016-05-13 13:41:58
【问题描述】:

我的 html 中有这个 javascript 代码。

answers.push({
    answer:$('#answer_1').val(),
    correctAnswer:$('#choice_1').is(":checked")
});
questions.push({
    questionNumber:1,
    questionType:questionType, 
    questionText:questionText,
    answers:answers
}); 
$('.hiddenField').val(JSON.stringify(questions));    

如您所见,我在问题数组中有答案数组。我想将此问题数组传递给服务器端 javascript 文件。我正在尝试在 HTML 表单的 POST 方法中使用隐藏输入来执行此操作,如下所示。

<form action="/new" method="POST">
<div class = "quiz_basic">
<input type = "hidden" class = "hiddenField" name = "questions" />
</div> </form>

在服务器端 js 文件中,当我尝试使用 req.body.questions 参数访问它时,我收到“unexpected token u”错误。这是我的服务器端代码。我正在使用 nodejs 框架。

    router.post('/new', function(req, res, next){
    var questions = JSON.parse(req.body.questions);
    console.log('Question array is ', questions);
    var answers = JSON.parse(req.body.questions.answers);
    console.log('Answer array is ', answers);
  res.send('success');
}

如果我从 questions 数组中删除 answers 数组对象并仅通过 HTML POST 方法传递它,我可以毫无问题地解析它。我应该如何通过 HTML 发送一个将另一个数组作为其元素之一作为一个对象的数组?各位大神能帮帮我吗?

questions.json 看起来像这样

[{"questionNumber":1,"questionType":"radio","questionText":"Whats your name","answers":[{"answer":"Peter","correctAnswer":true},{"answer":"Dave","correctAnswer":false},{"answer":"Adam","correctAnswer":false},{"answer":"Steve","correctAnswer":false}]}]

如上所述,如果我删除“answers”数组并发送它,它不会在服务器端引发错误。

谢谢

【问题讨论】:

  • 请修正您的 HMTL 格式:... &lt;div class="quiz_basic"&gt;&lt;input type="hidden" class="hiddenField" name="questions" /&gt; ...
  • 你能写出完整的错误堆栈跟踪吗?
  • 可以通过AJAX(XmlHttpRequest)提交给服务器JS数组和对象。它有很多方便的包装器,例如在 jQuery 中。
  • 你能发帖,关于 json 的问题是什么样的吗?
  • 用更多细节编辑了我的帖子。添加了 questions.json,格式化为 html

标签: javascript html node.js forms associative-array


【解决方案1】:

你有有效的 JSON 字符串,当你解析它 var questions = JSON.parse(req.body.questions); 时,你会得到 Array 的对象 - 我们到目前为止都很好(嵌套的 Array 没有问题)。

第一个问题在您尝试解析 var answers = JSON.parse(req.body.questions.answers); 时开始。 req.body.questions此时是String,无法访问属性.answers。解决方案:不要第二次解析,让我们使用已经解析的var questions

第二个问题是.answers 不属于var answers,因为它是Array。它是数组元素的属性。解决方案:让我们取第一个数组元素var answers = questions[0].answers;

尝试这样做:

router.post('/new', function(req, res, next){
    var questions = JSON.parse(req.body.questions);
    console.log('Question array is ', questions);
    var answers = questions[0].answers;
    console.log('Answer array is ', answers);
  res.send('success');
}

这解决了解析问题,但不确定初始 JSON 结构是否正确。如果 'questions' 数组中有多个问题,你打算一次性发布它们吗?如果是,那么应该涉及某种循环,以便获得正确的答案 (var answers = questions[0].answers => questions[i].answers)

【讨论】:

  • 是的,先生。太感谢了。你对我的json是正确的。我会有不止一个问题,所有问题都会一次提交。我正在使用 Mongo db 来保存这些,并且我正在遍历问题数组长度并能够将其与相应的答案数组一起保存。像这样,如果我遗漏了什么,或者您对以更好的方式做这件事有任何意见,请告诉我。
  • var questions = JSON.parse(req.body.questions); for (i = 0; i
  • 乐于助人!我认为您的解决方案听起来很合理。编码愉快!
猜你喜欢
  • 2019-06-11
  • 2018-03-22
  • 2020-01-25
  • 2014-04-05
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多