2017-07-14 92 views
0

在NodeJS中使用SQL Server,並且我確認它正在提取數據,但我試圖將數據傳回給調用函數。NodeJS MSSQL驅動程序將數據傳遞給調用函數

這裏是我的電話,以查詢數據庫的功能:

const dbq = require('./dbquery.js'); 
app.get('/:id', (req, res) => { 
    reqlog(`/${req.params.id}`); 
    var set = dbq.getPersonById(req.params.id); 
    console.log(set); 
}); 

,這裏是內部dbquery.js功能:

qry.getPersonById = (id) => { 

    mssql.connect(sqlConfig).then(() => { 
    new mssql.Request().query(`select * from FNVPeople where IndivID=${id}`).then((record)=>{ 
     console.log(record); 
     return record; 
    }).catch((err)=>{ 
     console.log(err); 
    }); 
    }); 
} 

如果我在函數調用這個樣子?

var dataset = await(dbq.getPersonById(req.params.id));

回答

0

你應該承諾返回給客戶端處理(注意兩個額外returns):

qry.getPersonById = (id) => { 

    return mssql.connect(sqlConfig).then(() => { 
    return new mssql.Request().query(`...`) 
     .then((record)=>{ 
      console.log(record); 
      return record; 
     }) 
     .catch((err)=>{ 
      console.log(err); 
     }); 
    }); 

} 

然後,客戶的交易與承諾

app.get('/:id', (req, res) => { 
    reqlog(`/${req.params.id}`); 
    dbq.getPersonById(req.params.id).then(set => 
    console.log(set); 
); 
}); 

通過重寫承諾async/await您可以前n具有

qry.getPersonById = async (id) => { 

    try { 
    await mssql.connect(sqlConfig) 
    var record = await new mssql.Request().query(`...`); 
    console.log(record); 
    return record; 
    } 
    catch (err) { 
    console.log(err); 
    } 
} 

app.get('/:id', async (req, res) => { 
    reqlog(`/${req.params.id}`); 
    var set = await dbq.getPersonById(req.params.id); 
    console.log(set); 
}); 
+0

非常好!我也會嘗試這個解決方案,併爲未來的項目堅持下去。 –

1

由於異步性質。

嘗試以下:

const dbq = require('./dbquery.js'); 
app.get('/:id', (req, res) => { 
    reqlog(`/${req.params.id}`); 
    dbq.getPersonById(req.params.id, function(err, res){ 
     console.log(res); 
    });  
}); 


qry.getPersonById = (id, callback) => { 

    mssql.connect(sqlConfig).then(() => { 
     new mssql.Request().query(`select * from FNVPeople where IndivID=${id}`).then((record)=>{ 
      console.log(record); 
      callback(null, record); 
     }).catch((err)=>{ 
      console.log(err); 
     }); 
     }); 
    } 
+0

很聰明,總是習慣回調,但從來沒有寫過任何東西,需要一個!這是一個很好的解決方案!現在執行。謝謝! –

+0

@ChrisRutherford:考慮到你已經在使用承諾,你不必「降級」回調,儘管它在技術上是正確的。看看我的答案。 –

+0

@WiktorZychla我做了,謝謝! –