使用nodejs(expressjs)从mysql获取记录到表单

时间:2016-05-12 17:55:42

标签: node.js express ejs

想要将记录从mysql提取到Web表单,以便用户可以进行更改并进行更新。我从数据库中的不同表中获取记录。

update.js

    var express = require('express');
    var router = express.Router();
    var db     = require('./../db');

    router.get('/', function(req, res, next) {
      db.select('*').from('student').then(function(rows){
            res.render('update-student',{title:'Update Student',data:rows})
        });
    });

  router.get('/', function(req, res, next) {
      db.select('*').from('category').then(function(result){
            res.render('update-student',{title:'Update Student',edata:result})
        });
    });

    module.exports = router;

update_student.ejs

<select>
      <option></option>
      <% for (var i = 0; i < data.length; i++) {%>
     <option value=""><%= data[i].gender; %></option>
        <% }%>
 </select>

<select>
      <option></option>
      <% for (var i = 0; i < edata.length; i++) {%>
     <option value=""><%= edata[i].cat_name; %></option>
        <% }%>
 </select>

我有这个erorr&#34; edata未定义&#34;

请任何帮助

1 个答案:

答案 0 :(得分:3)

问题在于,当您创建路径时,第一次出现将发生,如果它们具有相同的路径,则其他出现。在你的例子中,你说你'/'将呈现更新学生,但只有第一个会发生,而在第一个你只发送学生的信息

基本上我所说的是:每条路线都是一个页面。你有两条路线,对吗?所以他们是两个不同的页面!在你的情况下,它们具有相同的路径,因此只有第一个路径才会呈现。

以下是我向您提出的建议:

<强> update.js

var express = require('express'),
    router  = express.Router(),
    db      = require('./../db');

router.get('/', function(req, res, next) {

  var isFinishedCount = 1,
      student         = [],
      category        = [];

  db.select('*').from('student').then(function(rows){
    student = rows;
    isFinished();
  });

  db.select('*').from('category').then(function(rows){
    category = rows;
    isFinished();
  });

  function isFinished(){
    if(isFinishedCount == 0){
      res.render('update-student',{
        title:'Update Student',
        data: {
          student : student,
          category: category
        }
      });
    }else{
      isFinishedCount--;
    }
  }

});

module.exports = router;

<强> update_student.ejs

<select>
  <option></option>
  <% for (var i = 0; i < data.student.length; i++) {%>
    <option value=""><%= data.student[i].gender; %></option>
  <% }%>
</select>

<select>
  <option></option>
  <% for (var i = 0; i < data.category.length; i++) {%>
    <option value=""><%= data.category[i].cat_name; %></option>
  <% }%>
</select>

代码未经过测试,对不起,我只想写给你。

以下是细分: 在路由器中,我们声明了三个变量。 isFinishedCount用于我们对db的异步调用以获取学生和类别,因为这两个对db的调用将在他们自己的时间内发生,一旦完成,我们测试我们是否可以呈现页面,这就是为什么我们之后调用isFinished()每个成功的db调用。我从来没有像你那样使用数据库调用,所以我只是复制代码并进行调整。

现在,结果我们放入了两个变量,学生和类别,以便稍后我们可以渲染页面并将它们提供给数据,所以当你在.ejs中获取你刚刚获得的数据时你将把它们放在数据中:

data - student
     - category

这为您提供了一个小“框”,您可以在其中放置所需的所有信息,因此稍后您将使用相同的模型为您的其他页面。通过这种方式,您将始终知道您的数据将位于“数据”中。

再次对不起,如果有任何错误,我没有机会测试它我必须在旅途中写它,我会在几小时内再次检查并检查代码,如果我得到机会。

快乐的编码!