NodeJs,用于同步开发的模式

NodeJs, pattern for sync developement

本文关键字:模式 开发 同步 用于 NodeJs      更新时间:2023-09-26

我是NodeJs和Express框架的新手。我知道Node在服务器端只使用一个线程。所以,我注意到这给我带来了一些问题,为了正确地开发我的应用程序。

在我的路由文件夹,我有一个文件index.js。这个文件管理用户从app.js请求的导航。

所以我决定创建一个路由函数test。在这个函数中,我只有这段代码

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

那么简单,那么容易。这就是模板测试。Jade在我的视图文件夹。伟大!但是我想把这个过程复杂化。在这个测试路由函数中,我想从MYSQL数据库加载一些内容。

为此,我在文件夹node_modules中创建了一个文件夹Models在里面,我只有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;

返回到我的路由测试功能:

我只想从表"test"中加载所有的文章。非常基本的。但这并不容易。为什么?因为在查询完成之前,NodeJs用模板呈现响应客户端,但不幸的是,没有加载行。异步问题…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中发现了其他关于这个问题的主题。进行同步查询,使用回调等。但是,在这里,如果我试图用回调来处理这个问题,那是行不通的……因为我需要将包含文章的模板发送给客户端,但我不能使用sync方法阻止该过程。

我很失落……我不明白如何构建我的应用程序。我不能创建一个良好的进行,以管理sql查询。有特定的模式或方法吗?

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

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

传递一个回调给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 });
  });
};

get 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连接返回模板。这只是通过调用堆栈将它作为回调传递的问题,所以它应该只在拥有数据库行之后被调用。

当我们使用回调时,它们不会阻塞你的应用程序