javascript - NodeJs,同步开发模式

标签 javascript mysql node.js express synchronization

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

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

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

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

如此简单,如此简单。这就是我的 View 文件夹中的模板 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;

返回我的路由测试函数:

我只想从“测试”表中加载所有文章。非常基本。但并不容易。 为什么 ? 因为在查询完成之前,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 中发现了其他主题,其中谈到了这个问题。进行同步查询,使用回调等.. 但是在这里,如果我尝试用回调来解决这个问题,那是行不通的……因为我需要向客户端发送带有文章的模板,但我不能用同步方法阻止这个过程。

我很迷茫......我不明白我必须如何构建我的应用程序。我无法创建一个好的进程来管理 sql 查询。有没有规律或具体方法?

或者我可能只需要从客户端发出 ajax 请求。我加载模板“测试”。在公共(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 });
  });

};

获取文章功能的变化:

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 - NodeJs,同步开发模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428903/

相关文章:

javascript - 为什么 .match() 会阻止我的代码执行?

javascript - IE8 中的 google map 意外调用

mysql - 通过查询自定义订单

sql - 第 3 方 sql 导入在导入 sql 文件时停止,出现错误 : #1068 - Multiple primary key defined

sql - 200K数据库查询结果耗时太长,提速提示?

node.js - 在 React 上导入 Node 模块

node.js - Node : How to change keys stored in LevelDB for accounts using the Accountdown module

javascript - 如何实现 HashMap

javascript - 如何自动将相对导入路径重写为绝对路径?

javascript - 如果 X 秒内没有事件,则运行切换类名的函数。如果事件,停止切换功能并重置不活动计时器