获取callback结果(Nodejs)

我的快速和sql查询代码有问题。 我不能得到下面的SQL查询的results的值,但是这在loggingresults 。 我已经在这里返回results了。

这是我的sql.js代码

 var dataContext = require('node2sql')({ username: 'user', password: 'password', server: '1xx.xx2.xx.xx9', options: { database: 'grades' } }); module.exports = { DataQuery: function(query) { query = query.replace(/\s+/g, '').split("/"); year = query[2].substr(2, 4); id = query[0]; period = query[1].toUpperCase(); if (period == 'SEM1') { period = "1st Semester"; } else if (period == "SEM2") { period = "2nd Semester"; }else if (period == 'SUM') { period = "Summer"; } var queryStr = "SELECT SubjectCode,Grade FROM dbo.grade_list_" + year + " WHERE StudentNo=\'" + id + "\' and Semester=\'" + period + "\'"; console.log(queryStr); dataContext.query(queryStr, function(err, results) { console.log(results) return results; }); } } 

这里是我的索引页面,你可以看到我想获取data的返回值并将其显示到我的索引页面(仅仅是一个testing)。

 var express = require('express'); var sql = require('../libs/sql'); var router = express.Router(); router.get('/', function(req, res, next) { var data = sql.DataQuery("01-666-123/sem2/2009") res.end(data); }); module.exports = router; 

我接受你的任何build议家伙。 我已经阅读过这个问题 ,但仍然无法弄清楚如何做这个工作。 谢谢

你不能从callback中返回。 (callback是asynchronous的,可以在任何时候完成。)试试这个:

sql.js

 var dataContext = require('node2sql')({ username: 'user', password: 'password', server: '1xx.xx2.xx.xx9', options: { database: 'grades' } }); module.exports = { DataQuery: function(query, callback) { query = query.replace(/\s+/g, '').split("/"); year = query[2].substr(2, 4); id = query[0]; period = query[1].toUpperCase(); if (period == 'SEM1') { period = "1st Semester"; } else if (period == "SEM2") { period = "2nd Semester"; }else if (period == 'SUM') { period = "Summer"; } var queryStr = "SELECT SubjectCode,Grade FROM dbo.grade_list_" + year + " WHERE StudentNo=\'" + id + "\' and Semester=\'" + period + "\'"; console.log(queryStr); dataContext.query(queryStr, callback); } } 

index.js

 var express = require('express'); var sql = require('../libs/sql'); var router = express.Router(); router.get('/', function(req, res, next) { sql.DataQuery("01-666-123/sem2/2009", function(err, data) { res.end(data); }); }); module.exports = router; 

你的代码的主要问题是可以随时调用callback,特别是(通常)在调用者返回之后。 您需要在sql提供程序的callback中完成HTTP请求:

 var dataContext = require('node2sql')({ username: 'user', password: 'password', server: '1xx.xx2.xx.xx9', options: { database: 'grades' } }); module.exports = { DataQuery: function(query,fn) { query = query.replace(/\s+/g, '').split("/"); year = query[2].substr(2, 4); id = query[0]; period = query[1].toUpperCase(); if (period == 'SEM1') { period = "1st Semester"; } else if (period == "SEM2") { period = "2nd Semester"; }else if (period == 'SUM') { period = "Summer"; } var queryStr = "SELECT SubjectCode,Grade FROM dbo.grade_list_" + year + " WHERE StudentNo=\'" + id + "\' and Semester=\'" + period + "\'"; console.log(queryStr); dataContext.query(queryStr, function(err, results) { console.log(results) // Note: Call code provided by your http server now that // the result is known. fn(err, results); }); } } 

而在你的http服务器上:

 var express = require('express'); var sql = require('../libs/sql'); var router = express.Router(); router.get('/', function(req, res, next) { // Note: The callback will fire when the sql data is available. // The function below goes into the fn argument in DataQuery. // DataQuery calls it when the data is ready. sql.DataQuery("01-666-123/sem2/2009", function(err, data) { res.end(data); }); }); module.exports = router;