Javascript 从模块函数返回的对象未定义
这一定是我不熟悉的范围问题。我写了一个小模块:Javascript 从模块函数返回的对象未定义,javascript,node.js,Javascript,Node.js,这一定是我不熟悉的范围问题。我写了一个小模块: (function () { var getPlanInfo = function (id, conn) { conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) { if (error) console.error('Query error: ' + error.stack);
(function () {
var getPlanInfo = function (id, conn) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) console.error('Query error: ' + error.stack);
console.log(result[0]); // Everything is great
return result[0];
});
};
modules.exports.getPlanInfo = function (id, conn) { return getPlanInfo(id, conn); // Typo }
})();
问题来了。当我从任何地方(模块本身或其他文件内部)调用它时,返回值总是未定义的。我在函数中进行了检查,查询按预期返回结果
var backend = require('./module.js');
var t = backend.getPlanInfo();
t是未定义的。如果我从模块本身(该模块中的另一个函数)内部调用该方法,情况也是如此
我熟悉javascript中的回调原理,以及如何将对象和函数作为参数传递以保持在范围内。这是这里的问题还是node.js
我在开发者控制台(Chrome)中试过,效果与预期一样。您不会从
getPlanInfo
返回任何内容。可能您想编写modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}
(使用
返回getPlanInfo;
而不是返回getPlanInfo();
)您不会从返回任何内容。可能您想编写modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}
(使用返回getPlanInfo;
而不是返回getPlanInfo();
)您不会从返回任何内容。可能您想编写modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}
(使用返回getPlanInfo;
而不是返回getPlanInfo();
)您不会从返回任何内容。可能您想编写modules.exports.getPlanInfo=function(id,conn){return getPlanInfo;}
(使用返回getPlanInfo;
而不是返回getPlanInfo();
)连接查询()
看起来是异步的。因此,您不能从getplannifo()
返回其结果,因为getplannifo()
早在结果可用之前就返回了。从conn.query()
回调返回result[0]
只会将一段数据返回到conn.query()
基础结构中<代码>getPlanInfo()
早就返回了
如果需要异步结果,则必须更改getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等
下面是一种简单的回调方法:
var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}
console.log(result[0]); // Everything is great
callback(0, result[0]);
});
};
modules.exports.getPlanInfo = getPlanInfo;
然后,该模块的调用者将如下所示:
var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});
conn.query()
看起来是异步的。因此,您不能从getplannifo()
返回其结果,因为getplannifo()
早在结果可用之前就返回了。从conn.query()
回调返回result[0]
只会将一段数据返回到conn.query()
基础结构中<代码>getPlanInfo()
早就返回了
如果需要异步结果,则必须更改getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等
下面是一种简单的回调方法:
var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}
console.log(result[0]); // Everything is great
callback(0, result[0]);
});
};
modules.exports.getPlanInfo = getPlanInfo;
然后,该模块的调用者将如下所示:
var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});
conn.query()
看起来是异步的。因此,您不能从getplannifo()
返回其结果,因为getplannifo()
早在结果可用之前就返回了。从conn.query()
回调返回result[0]
只会将一段数据返回到conn.query()
基础结构中<代码>getPlanInfo()
早就返回了
如果需要异步结果,则必须更改getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等
下面是一种简单的回调方法:
var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}
console.log(result[0]); // Everything is great
callback(0, result[0]);
});
};
modules.exports.getPlanInfo = getPlanInfo;
然后,该模块的调用者将如下所示:
var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});
conn.query()
看起来是异步的。因此,您不能从getplannifo()
返回其结果,因为getplannifo()
早在结果可用之前就返回了。从conn.query()
回调返回result[0]
只会将一段数据返回到conn.query()
基础结构中<代码>getPlanInfo()早就返回了
如果需要异步结果,则必须更改getplannifo()
以使用支持获取异步结果的机制,例如直接回调或承诺等
下面是一种简单的回调方法:
var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}
console.log(result[0]); // Everything is great
callback(0, result[0]);
});
};
modules.exports.getPlanInfo = getPlanInfo;
然后,该模块的调用者将如下所示:
var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});
我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。我想你想做。。。modules.exports.getPlanInfo=getPlanInfo;研究异步函数。这可能有助于他们调用所需函数,但无法解决返回结果的问题。这可能有助于他们调用所需函数,但无法解决返回结果的问题。这可能有助于他们调用所需函数,但这不能解决返回结果的问题。这可能有助于他们调用所需的函数,但不能解决返回结果的问题。