2017-02-08 8 views
1

У меня возникла проблема с кодом запроса express и sql. Я не могу получить значение results запроса sql ниже, но это работает при регистрации results. Я уже возвратил results.Получите результаты обратного вызова (Nodejs)

Вот мой код 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 и показать его на моей странице индекса (только тест).

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; 

Я принимаю любые ваши предложения, ребята. Я уже прочитал этот question, который был задан раньше, но все же я не могу понять, как это сделать. Спасибо

+0

Я не могу не заметить, что ваш 'DataQuery' функция принимает' fn', но ничего не делает с этим. Похоже, это может быть частью решения. –

+0

Я этого не заметил. Все еще не работает. Я отредактирую код выше. Спасибо – user3012847

+0

Вам необходимо передать эту функцию обратного вызова ... Проверьте ответ ниже ... –

ответ

2

Вы не можете вернуться из обратного вызова. (Callbacks являются асинхронными и могут завершить в любое время.) Попробуйте это:

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; 
+0

Последний вызов в вашей функции 'DataQuery' является немного избыточным. Просто вызовите 'dataContext.query (queryStr, callback)'. –

+0

Право ... Спасибо ... –

+0

Спасибо за решение @Sandesh my сейчас работает! – user3012847

1

Основная проблема с вашим кодом является то, что обратные вызовы могут быть (обычно) после вызова вызывающего абонента. Вам нужно выполнить запрос HTTP в обратный вызов от провайдера SQL:

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; 
+0

Спасибо за ответ @Art. Я пробовал оба кода, и это устранило мою проблему. – user3012847

Смежные вопросы