如何使用node.js在mysql上进行multy查询

时间:2016-04-04 05:47:40

标签: mysql node.js

我试图对MySQL数据库运行2次查询,但它们无法运行。显示它,得到错误,我能以更好的方式做到这一点吗?我主要询问如何在home.handlebars文件中显示它以及如何从MySQL数据库中进行多个查询。

public String FileDownload(...){
     String url = ....;
            String res = ...;
            String outdir = ...;
            File outputFile = new File(outdir, filename);


            BufferedInputStream in = null;
            FileOutputStream fout = null;


            try {
                URL obj = new URL(url);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();

                con.setRequestMethod("POST");
                con.setRequestProperty("param1", value);//post parameters

                String urlParameters = ...;
                // Send post request
                con.setDoOutput(true);
                DataOutputStream wr = new DataOutputStream(con.getOutputStream());
                wr.writeBytes(urlParameters);
                wr.flush();
                wr.close();

                int responseCode = con.getResponseCode();

                if (responseCode == 200) {
                    in = new BufferedInputStream(con.getInputStream());
                    fout = new FileOutputStream(outputFile);

                    final byte data[] = new byte[1024];
                    int count;
                    while ((count = in.read(data, 0, 1024)) != -1) {
                        fout.write(data, 0, count);
                    }
                    res = "true";
                } else {
                    res = con.getResponseMessage();
                }

            } catch (Exception e) {
                e.printStackTrace();
                Log.e(TAG, "Exception in file Download:" + e.getMessage());
                res = "false";
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                    if (fout != null) {
                        fout.close();
                    }
                    res = "true";
                } catch (IOException e) {
                    e.printStackTrace();
                    res = "false";
                }
            }

            return res;
}

以下是home.handlebars文件

var express = require('express');
var handlebars = require('express-handlebars');
var bodyParser = require('body-parser')
var mysql = require('mysql');

var app = express();

app.engine('handlebars', handlebars({defaultLayout: 'main'}));
app.set('views', __dirname + '/views');
app.set('view engine', 'handlebars');
app.use(express.static('public'));
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'translation_project'
});

connection.connect();

app.get('/', function(req, res) {

    var translatorid = 45;

    var sqlQuery = "SELECT title,type FROM itemtable;"
    connection.query(sqlQuery,function(err,rows,fields){
        if(err){
            console.log('Error'+err);
        }else{
            res.render('home',{items:rows});    // to be displayed in the home page
        }
    });
    var sqlQuery2 = "SELECT dateoftranslation FROM translateditems;"
    connection.query(sqlQuery2,function(err,rows,fields){
        if(err){
            console.log('Error'+err);
        }else{
            res.render('home',{dates:rows});    // to be displayed in the home page
        }
    });

});

app.listen(3000, function() {
    console.log('Server is running at port 3000');
});

以下是home.handlebars文件

<h1> My Applied Items </h1>
{{#each items}} <!-- the items refreneced in the index page-->

<p>{{title}}</p>
<p>{{type}}</p>


{{/each}}
{{#each dates}} <!-- the dates refreneced in the index page-->

<p>{{dateoftranslation}}</p>


{{/each}}

2 个答案:

答案 0 :(得分:1)

我会考虑使用Promises,这样您就可以在将结果发送到客户端之前等待两个查询返回:

function query(sqlQuery) {
    return new Promise(function (resolve, reject) {
        connection.query(sqlQuery, function (err, result) {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        });
    });
}

app.get('/', function (req, res) {
    var query1 = query("SELECT title,type FROM itemtable;");
    var query2 = query("SELECT dateoftranslation FROM translateditems;");

    Promise.all(query1, query2).then(function (result) {
        res.render('home', {
             items: result[0],
             dates: result[1]
        });
    });
});

答案 1 :(得分:1)

由于connection.query()的异步性,您应该在回调嵌套中执行此操作。

app.get('/', function(req, res) {

  var translatorid = 45;
  var sqlQuery = "SELECT title,type FROM itemtable;",
    sqlQuery2 = "SELECT dateoftranslation FROM translateditems;";
  connection.query(sqlQuery,function(err,rows1){
    if(err){
      console.log('Error'+err);
    }
    else{
      connection.query(sqlQuery2,function(err,rows2){
        if(err){
          console.log('Error'+err);
        }
        else{
          res.render('home',{items:rows1,dates:rows2});
        }
      });
    }
  });
});

如果您要执行多个查询并且不想要回调嵌套(由于多嵌套回调不可读),那么您应该尝试promise或者您可以以async方式做到这一点。 下面是异步方式。

var async=require('async');
connection.connect();

app.get('/', function(req, res) {

  var translatorid = 45;
  var sqlQuery = "SELECT title,type FROM itemtable;",
    sqlQuery2 = "SELECT dateoftranslation FROM translateditems;",
    sqlQuery3="someQuery",
    sqlQuery4="someOtherQuery",
    sqlQuery5="someOtherOtherQuery";

  async.parallel([function(cb){
    connection.query(sqlQuery,function(err,rows1){
      if(err){
        console.log('Error'+err);
        cb(err);
      }
      else{
        cb(null,rows1);
      }
    });
  },function(cb){
    connection.query(sqlQuery2,function(err,rows2){
      if(err){
        console.log('Error'+err);
        cb(err);
      }
      else{
        cb(null,rows2);
      }
    });
  },function(cb){
    connection.query(sqlQuery3,function(err,rows3){
      if(err){
        console.log('Error'+err);
        cb(err);
      }
      else{
        cb(null,rows3);
      }
    });
  },function(cb){
    connection.query(sqlQuery4,function(err,rows4){
      if(err){
        console.log('Error'+err);
        cb(err);
      }
      else{
        cb(null,rows4);
      }
    });
  },function(cb){
    connection.query(sqlQuery5,function(err,rows5){
      if(err){
        console.log('Error'+err);
        cb(err);
      }
      else{
        cb(null,rows5);
      }
    });
  }],function(err,results){
    if(err){
    //  out of those 5 tasks at least one caused some error.
    //  handle that.
      return;
    }
  //  no error occurred.
    var rows1=results[0],
      rows2=results[1],
      rows3=results[2],
      rows4=results[3],
      rows5=results[4];
    res.render('home',{items:rows1,dates:rows2,other1:rows3,other2:rows4,other3:rows5});
  });
});