node.js - 使用nodejs(expressjs)从mysql获取记录到表单

标签 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>

我遇到了这个错误“edata未定义

请帮忙

最佳答案

问题是,当您创建一条路线时,第一次发生的情况将会发生,而其他情况如果具有相同的路径则不会发生。在您的示例中,您声明您的“/”将呈现更新学生,但只会发生第一个,并且在第一个中您仅发送来自学生的信息

我想说的是:每条路线都是一个页面。你有两条路,对吗?所以它们是两个不同的页面!在您的情况下,它们具有相同的路径,因此只有第一个会渲染。

这是我给你的建议:

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 用于我们对数据库的异步调用以获取学生和类别,因为对数据库的这两个调用将在自己的时间发生,一旦每个调用完成,我们就测试是否可以渲染页面,这就是为什么我们在每次成功的数据库调用后调用 isFinished() 。我从来没有像你一样使用过数据库调用,所以我只是复制你的代码并进行调整。

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

data - student
     - category

这为您提供了一个小“盒子”,您可以在其中放置所需的所有信息,以便稍后您可以在其他页面中使用相同的模型。这样您将始终知道您的数据将位于“数据”内。

再次抱歉,如果有任何错误,我没有机会测试它,我必须在旅途中编写它,我会在几个小时后再次检查,并在有机会时测试代码。

祝你编码愉快!

关于node.js - 使用nodejs(expressjs)从mysql获取记录到表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37194228/

相关文章:

javascript - 异步链接模式

java - 我应该如何设计一个 wordpress 后端 + react + java 前端应用程序?

javascript - 如何将 JSON 数据获取到我的 ejs 模板中?

javascript - 带有 ExpressJS 路由器的 CRUD

html - 如何在 LI 元素中垂直居中图像?

javascript - 依次执行 Promise.all

node.js - 在 phpStorm 7 中调试命令行 NodeJS 脚本

node.js - Azure Cosmos DB : TypeError: Cannot read property 'electionId' of undefined

javascript - 从 NodeJS 发送数据而不重新渲染整个页面?

node.js - 异步添加快捷路线