NodeJs,用于同步开发的模式
NodeJs, pattern for sync developement
我是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连接返回模板。这只是通过调用堆栈将它作为回调传递的问题,所以它应该只在拥有数据库行之后被调用。
当我们使用回调时,它们不会阻塞你的应用程序
- webpack开发模式和生产构建模式之间有什么区别
- Pinterest API应用程序处于开发模式(因此我可以使用http重定向)
- 不确定我在PHP AJAX中使用的是什么开发模式
- ReactJS处于开发模式
- 在开发模式下屏蔽本地主机上的谷歌广告
- GWT开发模式或移动设备上的超级开发模式
- 具有依赖项目源的超级开发模式
- 为电子邮件开发正则表达式模式
- 开发模式下 Rails 3.2 的请求处理顺序
- 检查是否在开发人员模式下安装了 Opera 扩展
- jQuery widget 开发 - 我可以使用 MVC 模式吗?
- Rails 4 App-JS在开发模式下可以与Webrick合作,但不能与Passenger/Apache2合作
- 如何从JavaScript中判断ReactJS是否处于开发模式
- AngularJS使用GruntJS的开发模式
- 开发公式/模式来确定位置
- NodeJs,用于同步开发的模式
- 开发服务器端node.js的良好架构/模式是什么?
- 生产模式下的UglifyJSPlugin显示一个React开发模式警告
- 是否有一个标准的方法来指定一个node.js应用程序是在生产模式(或开发模式)
- Jquery插件开发模式