2

假设我有一个 Express 应用程序,我想显示从数据库中获取的内容。我有一个包含这个的文件(使用 node-mysql 进行数据库交互)

exports.getData = function() {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    return rows[0];                                                                               
  });                                                                                                                                                                       
}

我希望能够调用它并将数据传递给模板语言。但是,它不是那样工作的,因为(我认为)回调直到函数退出后才会返回,导致 getData 返回未定义。

我一定错过了一些关于回调的重要“啊哈”时刻。如果我想与数据库交互,我是否被迫在 routes/index.js (我正在服务的页面的控制器)中执行所有逻辑并最终在一系列回调的底部呈现页面?

4

4 回答 4

3

传入一个回调作为getData()导出的参数...

exports.getData = function(callback) {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    callback(error, rows[0]);                                                                               
  });                                                                                                                                                                       
}

然后,你可以做...

var data = require("data");
data.getData(function(error, firstRow) {  });

Tadman 提出了一个很好的建议,即遵循第一个参数是错误的约定。这样做,我们可以传播错误信息。

于 2013-10-10T18:50:27.320 回答
0

像这样的东西可能是你正在寻找的东西。在查询回调中调用另一个函数。

exports.getData = function() {                                                                   
  connection.query('SELECT * FROM table', function (error, rows, fields) {                                                                                    
    renderPage(rows[0]);                                                                               
  });                                                                                                                                                                       
}

function renderPage(data) {
    app.render('page', {
        "data": data
    }
}
于 2013-10-10T18:53:43.750 回答
0

您可以在此链接中使用“promise”来查找更多信息

在处理异步代码时,Promise 为原始回调提供了一种引人注目的替代方案。不幸的是,promise 可能会令人困惑,也许你已经把它们写掉了。然而,为了以可互操作和可验证的方式展现 Promise 的本质之美,已经做了大量工作。结果就是 Promises/A+,这是一个正在进入 Promise 库甚至 DOM 的规范。

var promise = (connection.query('SELECT * FROM table')
promise.then(function (somedata){renderPage(rows[0])};)
于 2013-10-10T19:03:25.950 回答
0

您可能想查看异步模块:https ://github.com/caolan/async

这是一个示例,我在渲染视图之前并行进行了一些数据调用。

var async = require('async'),
    example = require('example-api-client');

module.exports = function(app){

    app.get('/example', function(req, res){

        async.parallel(
            {
                apples: function(cb){
                    example.getData('apples', cb);
                },
                oranges: function(cb){
                    example.getData('oranges', cb);
                }
            },
            function(err, results){
                //TODO: handle errors
                res.render('example', results);
            }
        );

    });

};
于 2013-10-10T19:03:54.850 回答