Html 如何通过res.render()函数将多个db.query的多个结果发送给客户端?

Html 如何通过res.render()函数将多个db.query的多个结果发送给客户端?,html,node.js,ejs,Html,Node.js,Ejs,我正在建立一个网站。我的客户端代码在EJS中,服务器代码在Node.js中。通过res.send();,成功发送db.query的results变量;。但是现在我想使用两个查询并检索这些查询的值并将其发送到客户端。但若我只使用一个变量,那个么这很好,但当我在客户机中使用两个查询的变量时,它会给我错误:错误:发送后不能设置头 这是我的login.js文件: var username; var password; var result; module.exports = { insert

我正在建立一个网站。我的客户端代码在EJS中,服务器代码在Node.js中。通过res.send();,成功发送db.query的results变量;。但是现在我想使用两个查询并检索这些查询的值并将其发送到客户端。但若我只使用一个变量,那个么这很好,但当我在客户机中使用两个查询的变量时,它会给我错误:错误:发送后不能设置头

这是我的login.js文件:

var username;
var password;
var result;

module.exports = {

    inserttest : (req,res) => {

        // let query = "SELECT * FROM `login` where username"; // query database to get all the players


        db.query('SELECT * FROM login WHERE username = ? AND password = ?', [username, password], function(error, result, fields) {
            if (error) {
                res.redirect('/login');
            }

            var moisture = 11232;
            var ph = 1121;
            var ec = 543;
            var date1=new Date();

            const sqlq='insert into usertest values ?';
            var values = [
            [result[0].kitno,moisture,ph,ec,date1]
            ];
            db.query(sqlq, [values], function(error, results, fields) {
                if(error)
                {
                    console.log("error");
                    //var a
                    //res.send(500,'showAlert') 
                }
                else{
                    console.log("1 row inserted successfully");
                }
                var result2= doQuery1();

                res.render('mytest',
                {
                    url:"/mytest",
                    title:"WELCOME2",
                    results1:result,
                    results2:result2
                });
            });
        });

        function doQuery1(){
            let query = "SELECT * FROM usertest WHERE kitno IN(select kitno from login where username = ? AND password = ?)"; 
            var resource;
            db.query(query, [username, password], function(error, result4, fields){
                resource=result4;
            });
            return resource;
        };
    },
_http_outgoing.js:491
    throw new Error('Can\'t set headers after they are sent.');
    ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at Array.write (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\finalhandler\index.js:285:9)
    at listener (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\on-finished\index.js:169:15)
    at onFinish (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\on-finished\index.js:100:5)
    at callback (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\ee-first\index.js:55:10)
    at IncomingMessage.onevent (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\ee-first\index.js:93:5)
    at emitNone (events.js:106:13)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
这是我的EJS,即login.EJS文件代码:

var username;
var password;
var result;

module.exports = {

    inserttest : (req,res) => {

        // let query = "SELECT * FROM `login` where username"; // query database to get all the players


        db.query('SELECT * FROM login WHERE username = ? AND password = ?', [username, password], function(error, result, fields) {
            if (error) {
                res.redirect('/login');
            }

            var moisture = 11232;
            var ph = 1121;
            var ec = 543;
            var date1=new Date();

            const sqlq='insert into usertest values ?';
            var values = [
            [result[0].kitno,moisture,ph,ec,date1]
            ];
            db.query(sqlq, [values], function(error, results, fields) {
                if(error)
                {
                    console.log("error");
                    //var a
                    //res.send(500,'showAlert') 
                }
                else{
                    console.log("1 row inserted successfully");
                }
                var result2= doQuery1();

                res.render('mytest',
                {
                    url:"/mytest",
                    title:"WELCOME2",
                    results1:result,
                    results2:result2
                });
            });
        });

        function doQuery1(){
            let query = "SELECT * FROM usertest WHERE kitno IN(select kitno from login where username = ? AND password = ?)"; 
            var resource;
            db.query(query, [username, password], function(error, result4, fields){
                resource=result4;
            });
            return resource;
        };
    },
_http_outgoing.js:491
    throw new Error('Can\'t set headers after they are sent.');
    ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at Array.write (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\finalhandler\index.js:285:9)
    at listener (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\on-finished\index.js:169:15)
    at onFinish (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\on-finished\index.js:100:5)
    at callback (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\ee-first\index.js:55:10)
    at IncomingMessage.onevent (C:\Users\Rohit\Desktop\Project_me\soil2\node_modules\ee-first\index.js:93:5)
    at emitNone (events.js:106:13)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
这里我使用result1[0]。名称作为标题。结果2[i].for循环中的ph值

  <main class="page-content">
        <div class="container-fluid">
          <h2>My Tests</h2>
          <hr>
          <div id="main">
            <div id="left" class="container">
            <br>
            <form method="get" action="/insertvalues">

            <input type="submit" value="Start Test" />  
            </form>
            <% for (var i = 0; i < results2.length; i++) { %>

                  <%=results2[i].ph%>

              <%}%>

            <br>

有一个
Promise
版本的
mysql
包:
mysql2
。使用promise,您可以等待
promise
解决或拒绝类似于
sync
code的问题

你可以实现你想要实现的目标,比如:

const mysql = require('mysql2/promise');

module.exports = {


  inserttest : async (req,res) => {

    // let query = "SELECT * FROM `login` where username"; // query database to get all the players

    const connection = await mysql.createConnection({host:'localhost', user: 'root', database: 'test'});
    try {
      const [rows, fields] = await connection.execute('SELECT * FROM login WHERE username = ? AND password = ?', [username, password]);
    } catch (e) {
      console.error(e);
      res.redirect('/login');
    }

    var moisture = 11232;
    var ph = 1121;
    var ec = 543;
    var date1=new Date();

    const sqlq='insert into usertest values ?';
    var values = [
      [result[0].kitno,moisture,ph,ec,date1]
    ];

    try {
      // will wait till execution finishes
      await connection.execute(sqlq, [values]);
      console.log("1 row inserted successfully");
    } catch (e) {
      console.error(e)
    }
    var result2= doQuery1();

    res.render('mytest',
               {
      url:"/mytest",
      title:"WELCOME2",
      results1:result,
      results2:result2

    });
  }

  async function doQuery1(){
    let query = "SELECT * FROM usertest WHERE kitno IN(select kitno from login where username = ? AND password = ?)"; 
    var resource;
    try {
      const connection = await mysql.createConnection({host:'localhost', user: 'root', database: 'test'});
      resource = await connection.execute(query, [username, password]);
      return resource;
    } catch (e) {
      console.error(e);
    }
  };
}

以这种方式使用
promise
async/await
可以使其按顺序排列。

无法查看代码中的任何地方
result1
这是一个变量。我们想用什么就用什么。我正在result1中存储第一次查询的结果。如果
results1
来自
回调
,那么您将很难使用它。你可以让它工作。如果你可以发布代码,可以展示一些例子。好的,我会把它推到github。将向您发送链接。