我是NodeJs和Express框架的新手。我知道Node只在服务器端使用一个线程。因此,为了正确开发我的应用程序,我注意到了一些问题。
在“路由”文件夹中,我有一个文件index.js。该文件管理用户从app.js请求的导航。
所以我决定创建一个路由函数"test“。在这个函数中,我只有这个代码
exports.test = function(req, res){
res.render('test', {});
};那么简单,那么容易。这是在“我的视图”文件夹中重新划分模板test.jade。伟大的人!但我想把这个过程复杂化。在这个测试路由函数中,我希望从MYSQL数据库中加载一些内容。
为此,我在文件夹mysqlConnection.js node_modules中创建了一个文件夹Models,只有2个文件,第一个文件导出变量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使用模板呈现来响应客户端,但是,unfornlty没有加载行。异步问题..。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', {});
};我发现其他人都在堆积如山地谈论这个问题。进行同步查询,处理回调等。但是,在这里,如果我试图用回调来处理这个问题,那是行不通的.因为我需要向客户端发送带有文章的模板,但是我不能用sync方法阻止这个过程。
我很迷茫..。我不明白如何构建我的应用程序。为了管理sql查询,我无法创建一个良好的过程。有一种模式还是一种特定的方法?
或者,我只需要从客户端发出ajax请求。我加载模板“测试”。在公用文件夹中的javascript文件中,我要求服务器加载文章内容并等待成功回调函数?不是很干净..。
为了你的答案。我发现的其他答案并没有帮助我理解如何使用NodeJs来管理这个问题。
发布于 2014-06-26 11:25:29
将回调传递给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项目函数的更改:
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连接返回模板。因此,这只是将其作为回调传递到调用堆栈中的问题,因此,只有在您拥有数据库行之后才应该调用它。
在我们处理回调时,它们不会阻止您的应用程序。
https://stackoverflow.com/questions/24428903
复制相似问题