首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJs,同步开发模式

NodeJs,同步开发模式
EN

Stack Overflow用户
提问于 2014-06-26 11:08:45
回答 1查看 149关注 0票数 2

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

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

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

代码语言:javascript
复制
exports.test = function(req, res){
   res.render('test', {});
};

那么简单,那么容易。这是在“我的视图”文件夹中重新划分模板test.jade。伟大的人!但我想把这个过程复杂化。在这个测试路由函数中,我希望从MYSQL数据库中加载一些内容。

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

代码语言:javascript
复制
var mysql = require('mysql');

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

DB.connect();
module.exports = DB;

在第二个文件中,articles_class.js,刚刚

代码语言:javascript
复制
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指令。

该功能的代码:

代码语言: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', {});
};

我发现其他人都在堆积如山地谈论这个问题。进行同步查询,处理回调等。但是,在这里,如果我试图用回调来处理这个问题,那是行不通的.因为我需要向客户端发送带有文章的模板,但是我不能用sync方法阻止这个过程。

我很迷茫..。我不明白如何构建我的应用程序。为了管理sql查询,我无法创建一个良好的过程。有一种模式还是一种特定的方法?

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

为了你的答案。我发现的其他答案并没有帮助我理解如何使用NodeJs来管理这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 11:25:29

将回调传递给getArticles:

代码语言:javascript
复制
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项目函数的更改:

代码语言:javascript
复制
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连接返回模板。因此,这只是将其作为回调传递到调用堆栈中的问题,因此,只有在您拥有数据库行之后才应该调用它。

在我们处理回调时,它们不会阻止您的应用程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24428903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档