我有这个代码: server.js:
var sql = require('./libs/mysql');
app.get('/status', function(req, res) {
res.send(sql.readName('1600'));
});
mysql.js:
exports.readName = function(name){
var connection = mysql.createConnection(option);
connection.connect();
connection.query('SELECT id FROM asterisk.users WHERE name= '+name, function (err, rows, fields) {
console.log('mysql: ' +rows[0].id);
return(rows[0].id);
});
现在,当我发送GET http://mydomain.com/status时,我无法收到回应。但在控制台日志中我看到了正确答案。我的错误在哪里?
答案 0 :(得分:0)
node.js中的大多数磁盘读取/数据库访问都是异步完成的。这允许node.js与它声称的一样快。您需要使用回调函数来处理这些读取操作的结果。如果您熟悉ajax,则概念类似。
您将从异步运行的connection.query
返回。这无处可归。 readName
实际上什么也没有返回。您需要做的是实际传递返回值的回调:
app.get("/status", function (req, res) {
sql.readName("1600", function (err, rows, fields) {
/* handle err */
res.send(rows[0].id);
});
});
当然必须调用此回调:
exports.readName = function (name, cb) {
/* snip */
connection.query(query + name, cb);
});
答案 1 :(得分:0)
您无法获得结果,因为return语句位于函数function (err, rows, fields)
中。你可以像这样使用回调
var sql = require('./libs/mysql');
app.get('/status', function(req, res) {
sql.readName('1600', function(result){
res.send(result);
});
});
exports.readName = function(name, callback){
var connection = mysql.createConnection(option);
connection.connect();
connection.query('SELECT id FROM asterisk.users WHERE name= '+name,
function (err, rows, fields) {
console.log('mysql: ' +rows[0].id);
callback(rows[0].id);
});
}
答案 2 :(得分:0)
感谢您的帮助。我发现上面描述的http错误原因。如果我使用像这个回调(row [0] .id)这样的回调函数会出现错误,但是如果我们使用像这个回调('id:'+ row [0] .id)这样的语法,那么一切都可以。因此,当我们发送res.send(响应)时,我们无法发送未命名的数据,需要在那里添加一些描述。
所以,我的最终代码如下所示:
server.js
var sql = require(./mysql);
app.get('/status', function(req, res) {
sql.readName('1600', function(result){
res.send(result);
});
});
<强> mysql.js 强>
var mysql=require(mysql);
exports.readName = function(name, callback){
var connection = mysql.createConnection(option);
connection.connect();
connection.query('SELECT id FROM asterisk.users WHERE name= '+name,
function (err, rows, fields) {
if(err) callback(err);
else{
console.log(rows[0].id);
callback('ID: '+rows[0].id);
}
});
return true;
};