NodeJs,同步开发的模式

我是新的NodeJs和Express框架。 我已经明白,节点在服务器端只有一个线程工作。 所以,我注意到这导致我一些问题,以正确开发我的应用程序。

在我的路线文件夹中,我有一个文件index.js。 这个文件pipe理用户从app.js中提出的导航。

所以我决定创build一个路由function“testing”。 在这个函数中,我只有那个代码

exports.test = function(req, res){ res.render('test', {}); }; 

这么简单,那么简单 这是在我的视图文件夹撕裂模板test.jade。 好极了! 但是我想使这个过程复杂化。 在这个testing路由function中,我想从我的MYSQL数据库加载一些内容。

为此,我在文件夹node_modules里创build了一个文件夹Models ,里面只有2个文件,第一个是mysqlConnection.js ,它导出variablesDB以便进行查询。

 var mysql = require('mysql'); var DB = mysql.createConnection( { host : 'localhost', user : 'root', password : '', database : 'test', } ); DB.connect(); module.exports = DB; 

在第二个文件articles_class.js中 ,我只有

 var DB = require('models/mysqlConnection'); var Article = function() { this.getArticles = function() { DB.query('SELECT * FROM articles;', function(err, rows, fields) { if (err) throw err; else { console.log(rows); return (rows); } }); } } module.exports = Article; 

回到我的路线testingfunction:

我只是想从表格加载“testing”所有的文章。 非常基本。 但不容易。 为什么? 因为在查询完成之前,NodeJs使用模板渲染来响应客户端,但是,不加载行的情况下是不可靠的。 asynchronous问题… Mysql不会阻止Nodejs javascript指令。

该函数的代码:

 exports.test = function(req, res){ var Article = require('models/articles_class'); a = new Article(); articles = a.getArticles(); console.log(articles); // undefined res.render('test', {}); }; 

我发现其他议题stackoverflow谈到这个问题。 进行同步查询,使用callback等..但是,在这里,如果我试图用callbackpipe理这个问题,这是行不通的…因为我需要发送到客户端模板的文章,但我不能阻止使用同步方法进行处理。

我很迷茫…我不明白如何build立我的申请。 我无法创build一个良好的进程来pipe理SQL查询。 有一种模式或一种特定的方法?

或者,也许我只需要从客户端发出一个Ajax请求。 我加载模板“testing”。 并在公共文件夹中的JavaScript文件,我要求服务器加载我的文章内容和等待成功callback函数? 它不是很干净

Thx为您的答案。 其他答案我发现并没有帮助我了解如何pipe理与NodeJs。

通过callbackgetArticles:

 exports.test = function(req, res){ var Article = require('models/articles_class'); a = new Article(); a.getArticles( function( articles ) { console.log(articles); // undefined res.render('test', { articles: articles }); }); }; 

更改您的获取文章function:

 var DB = require('models/mysqlConnection'); var Article = function() { this.getArticles = function( callback ) { DB.query('SELECT * FROM articles;', function(err, rows, fields) { if (err) throw err; else { console.log(rows); callback && callback(rows); } }); } } module.exports = Article; 

一旦res.render()被调用,Express将只通过打开的http连接返回模板。 所以只需要将它作为callback传递给您的调用堆栈,所以只能在获得数据库行后才能调用它。

由于我们正在使用callback,他们不会阻止您的应用程序。