这是nodejs app上下文中的控制器内容:
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来运行。如果我将它们放在函数之外,它们会在返回数据之前运行,因此未定义。 如何正确格式化模型代码,以便在从模型返回结果后正确访问“数据”? 是否建议使用“异步”或“承诺”等模块来处理这种情况?
答案 0 :(得分:0)
最简单的方法是将回调作为参数进行调用,然后调用数据。
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);
});
});
};
答案 1 :(得分:0)
将回调传递给读取功能
答案 2 :(得分:0)
您需要处理回调中的数据,因为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;