NodeJs,用于同步开发的模式

时间:2014-06-26 11:08:46

标签: javascript mysql node.js express sync

我是NodeJs和Express框架的新手。我已经明白Node只能在服务器端使用一个线程。所以,我注意到这导致了一些问题,以便正确开发我的应用程序。

在我的路线文件夹中,我有一个文件index.js。 此文件管理用户从app.js。

询问的导航

所以我决定创建一个路线功能" test"。 在这个函数中,我只有那个代码

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

如此简单,如此简单。那就是我的views文件夹中的模板test.jade。太棒了! 但我想复杂化这个过程。在这个测试路由功能中,我想从我的MYSQL数据库中加载一些内容。

为此,我在文件夹 node_modules 中创建了一个文件夹模型 在里面,我只有2个文件,第一个 mysqlConnection.js ,它导出变量DB以进行查询。

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;

返回路线测试功能:

我只想从表格中加载"测试"所有的文章。非常基本的。但并不容易。 为什么? 因为在查询完成之前,NodeJs使用模板渲染来响应客户端,但是,unfornlty,没有加载行。异步问题...... 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中找到了其他主题,它们谈到了这个问题。进行同步查询,使用回调等。 但是,对于,在这里,如果我尝试使用回调来管理这个问题,那就无法运行......因为我需要向客户端发送包含文章的模板,但我无法通过同步来阻止该过程方法

我很失落......我不明白我必须如何构建我的应用程序。我无法创建一个良好的进程来管理SQL查询。有一种模式或具体方法吗?

或者我可能只需要从客户端发出ajax请求。我加载模板" test"。并且在公共文件夹中的javascript文件中,我要求服务器加载我的文章内容并等待成功回调函数?它不是很干净......

谢谢你的回答。我发现的其他答案并没有帮助我理解如何使用NodeJ来管理它。

1 个答案:

答案 0 :(得分:1)

将回调传递给getArticles:

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

};

对获取文章功能的更改:

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;

Express只会在调用res.render()后通过打开的http连接返回模板。所以它只是通过调用堆栈将其作为回调传递,因此只应在拥有数据库行后调用它。

由于我们正在处理回调,因此他们不会阻止您的申请。