Javascript 异步函数不';跑不动

Javascript 异步函数不';跑不动,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,以下是nodejs应用程序上下文中的控制器内容: var express = require('express'), directory_router = express.Router(), directory_models = require('./directory_models'); directory_router.get('/list', function(req, res) { var data = directory_models.read_result

以下是nodejs应用程序上下文中的控制器内容:

 var express = require('express'),
    directory_router = express.Router(),
    directory_models = require('./directory_models');

directory_router.get('/list', function(req, res) {
    var data = directory_models.read_result(function (err, data) {
        console.log(data); // Need returned data here, but won't run
        res.send(data); // Same
    });
// If I try to access 'data' here it's empty
});

module.exports = directory_router;
下面是返回它在数据库中获取的数据的模型:

var settings = require('../../settings');

var read = function() {
    var read_result;

    settings.pg.connect(settings.conString, function (err, client, done) {
        client.query('SELECT link_title FROM links', function (err, result) {
            read_result = result.rows[0].link_title;
            console.log('from model');
            return read_result;
        });
    });

};

module.exports.read_result = read;
问题出在控制器中,我无论如何都找不到要运行的'data'console.log或res。如果我把它们放在函数之外,它们会在返回数据之前运行,因此是未定义的。 如何正确格式化模型代码,以便在从模型返回结果后能够正确访问“数据”?
建议使用诸如“异步”或“承诺”之类的模块来处理这种情况吗?

最简单的方法是获取回调作为参数并调用,然后访问数据

var read = function(cb) {
    settings.pg.connect(settings.conString, function (err, client, done) {
        client.query('SELECT link_title FROM links', function (err, result) {
            if (err) {
                return cb(err);
            }

            cb(null, result.rows[0].link_title);
        });
    });
};

将回调传递给read函数

您需要在回调中处理数据,因为nodejs是异步的

var express = require('express'),
directory_router = express.Router(),
directory_models = require('./directory_models');

directory_router.get('/list', function(req, res) {
var data = directory_models.read_result(function (err, data) {
    if (err){
       res.status(400).send("cant get data");
    } 
    else{
    console.log(data); // Need returned data here, but won't run
    res.send(data); // Same
    }
});
// If I try to access 'data' here it's empty
});
在模型内部,您需要回调作为参数,如:

var settings = require('../../settings');

var read = function(callback) {
var read_result;

settings.pg.connect(settings.conString, function (err, client, done) {
    client.query('SELECT link_title FROM links', function (err, result) {
if(err){ return callback(err,null) }
else{
        read_result = result.rows[0].link_title;
        console.log('from model');
        return callback(null, read_result);
    });
});

};  
module.exports.read_result = read;

read
不接受回调。因此,您传递给它的回调未被使用。您可能需要进一步解释。。。