我是NodeJs和Express框架的新手。我知道Node只在服务器端使用一个线程。因此,我注意到这会给我带来一些问题,以便正确开发我的应用程序。
在我的routes文件夹中,有一个index.js文件。
此文件管理用户从app.js请求的导航。
所以我决定创建一个路由函数“test”。
在这个函数中,我只有那个代码

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

如此简单,如此简单。这是“我的视图”文件夹中的模板test.jade。伟大的!
但我想使这个过程复杂化。在这个测试路由函数中,我想从MYSQL数据库中加载一些内容。
为此,我在文件夹节点模块中创建了一个文件夹模型
在里面,我只有两个文件,第一个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使用模板呈现来响应客户机,但是,不可原谅的是,没有加载行。异步问题。。。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”。在public文件夹中的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;

调用res.render()后,Express只通过打开的http连接返回模板。所以这只是一个通过调用堆栈将其作为回调传递的问题,所以只有在拥有数据库行之后才应该调用它。
因为我们正在处理回调,所以它们不会阻止您的应用程序。

关于javascript - NodeJ,用于同步开发的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24428903/

10-09 21:29