2017-03-20 130 views
0

編輯 我的問題稍有變化,所以我正在更新我的代碼並修改我的問題。一切似乎都工作,除了我沒有看到我的瀏覽器中返回我的JSON。Node.js數據庫查詢

這裏是我當前的代碼:

'use strict'; 
var util = require('util'); 
var http = require('http'); 
var sql = require("mssql"); 
var express = require('express') 
var port = process.env.PORT || 1337; 

var membershipNumber; 
var results; 
var queryString; 

var app = express(); 

function getParams() { 
    app.get('/:number', function (req, res) { 
     console.log("\nPARAMS:"); 
     console.log(req.params.number); 

     membershipNumber = req.params.number; 
     queryString = util.format('SELECT major_key, status, paid_thru FROM name WHERE major_key = \'%s\' and member_record = 1', membershipNumber); 
     console.log("\nQUERY:"); 
     console.log(queryString); 

     res.setHeader('Content-Type', 'application/json'); 
     // res.end(queryDatabase(queryString)); 
     res.send(queryDatabase(queryString)); 
    }); 
    app.listen(port); 
} 

function queryDatabase(query) { 
    var config = { 
     server: 'testserver', 
     database: 'test_db', 
     user: 'sa', 
     password: 'password', 
     port: 1433 
    }; 

    var connection = new sql.Connection(config); 

    connection.connect().then(function() { 
     var req = new sql.Request(connection); 
     req.query(query).then(function (recordset) { 
      results = recordset; 
      console.log("\nRESULTS:"); 
      console.log(results); 
      connection.close(); 

      //Convert results to JSON string 
      var jsonString = JSON.stringify(results); 
      console.log("\njsonString:"); 
      console.log(jsonString); 

      return jsonString; 

     }) 
      .catch(function (err) { 
       console.log(err); 
       connection.close(); 
      }); 
    }) 
     .catch(function (err) { 
      console.log(err); 
     }); 
} 

getParams(); 

這裏是我的console.log報表控制檯」

PARAMS: 
0001354648 

QUERY: 
SELECT major_key, status, paid_thru FROM name WHERE major_key = '0001354648' and member_record = 1 

RESULTS: 
[ { major_key: '0001354648', 
    status: 'SN', 
    paid_thru: 2016-10-31T00:00:00.000Z } ] 

jsonString: 
[{"major_key":"0001354648","status":"SN","paid_thru":"2016-10-31T00:00:00.000Z"}] 

回答

0

打印時,有兩個app.listen()電話:一個在appFunction(),另一個在getParams()。您應該只撥打app.listen()一次,並刪除appFunction()中的一個,因爲getParams()似乎是您在初始化時調用的函數。

如果你真的需要你的代碼如下結構的方式,試試這個:

function queryDatabase(query) { 
    var config = { 
    server: 'dbserver', 
    database: 'test_db', 
    user: 'sa', 
    password: 'password', 
    port: 1433 
    }; 

    var connection = new sql.Connection(config); 

    connection.connect().then(function() { 
     var req = new sql.Request(connection); 
     req.query(query).then(function(recordset) { 
      results = recordset; 
      console.log("\nRESULTS:"); 
      console.log(results); 
      connection.close(); 

      //Convert results to JSON string 
      jsonString = JSON.stringify(results); 
      console.log("\nJSON:"); 
      console.log(jsonString); 

      appFunction(jsonString); 
     }) 
     .catch(function(err) { 
      console.log(err); 
      connection.close(); 
     }); 
    }) 
    .catch(function(err) { 
     console.log(err); 
    }); 
} 

app.get('/:number', function(req, res) { 
    console.log("\nPARAMS:"); 
    console.log(req.params.number); 

    membershipNumber = req.params.number; 
    queryString = util.format('SELECT major_key, status, paid_thru FROM name WHERE major_key = \'%s\' and member_record = 1', membershipNumber); 
    console.log("\nQUERY:"); 
    console.log(queryString); 

    res.end(queryDatabase(queryString)); 
}); 

app.get('/', function(req, res) { 
    res.setHeader('Content-Type', 'application/json'); 
    res.send(jsonString); 
}); 

app.listen(port); 

注意,這隻會在一時刻一個請求工作。

我強烈建議在進行REST調用時將queryDatabase()函數的輸出返回給用戶;在這種情況下,你的'/:number'路由會返回你想要接收的JSON字符串。在您的應用程序,將REST風格與此界面,你會看到沿着線的東西:

GET http://<your-ip>:<your-port>/3 
RESPONSE: { some JSON } 

此時你就不需要「/」路線。

+0

我明白了,我在我的問題中提到過。刪除appFunction()中的問題是,當我將它取出時,我沒有得到JSON字符串。 – raginggoat

+0

抱歉。我做了一個編輯,提供了一種獲取JSON字符串的方法(請參閱帖子底部) –

+0

tl; dr:返回'/:number'路由中的JSON字符串,而不是使用其他路由將其返回。 –