2016-04-04 20 views
3

我試圖對MySQL數據庫運行2個查詢並且它們不工作。並顯示它,出現錯誤,我可以做更好的方法嗎?我主要問如何在home.handlebars文件中顯示它,以及如何從MySQL數據庫中創建多個查詢。如何使用node.js對mysql進行multy查詢

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}} 

這裏是home.handlebars文件

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>Users Profile</title> 
</head> 

<body> 
    <h1> Mohamed </h1> 
    {{{body}}} 
</body> 
</html> 
+0

您能否澄清一下問題所在? 「它給錯誤」不是很具描述性。請花點時間閱讀[如何提出一個好問題?](http://stackoverflow.com/help/how-to-ask)您可以隨時[編輯]您的問題。 – Carpetsmoker

+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

由於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}); 
    }); 
}); 
+0

這是一個很酷的,謝謝:)如果你有任何教程,我可以閱讀有關?再次感謝! –

+0

npmjs文檔是充足的....我已經添加到文檔的鏈接。檢查他們! – vkstack

+0

我很感激,謝謝! –