javascript - 承诺返回未定义的节点js
问题描述
我有一个连接到 sql 数据库、对其进行查询、将结果格式化为 html 表并返回html
变量的函数:
function getData() {
return new Promise((resolve, reject) => {
var sql = require("mssql");
var dbConfig = {
server: "server",
database: "db",
user: "user",
password: "pw"
}
var conn = new sql.Connection(dbConfig);
var req = new sql.Request(conn);
conn.connect(function (err) {
if (err) {
console.log(err);
reject(err);
return;
}
req.query("SELECT * FROM table",
(err, recordset) => {
// Here we call the resolve/reject for the promise
try {
// If the results callback throws exception, it will be caught in
// the catch block
resolve(resultsCallback(err, recordset));
}
catch (e) {
reject(e);
}
}
);
conn.close();
});
})
}
function resultsCallback(err, recordset) {
var tableify = require('tableify');
if (err) {
console.log(err);
throw err;
}
else {
var html = tableify(recordset);
html = html.replace('<table>', '');
html = html.replace('</table>', '');
return html;
}
};
我这样称呼它:
getData().then((data)=>{console.log("Table data:",data);})
.catch((error)=>{console.log("ERROR LOADING SQL:",error);})
但是,由于某种原因,此输出是:Table Data: undefined
我不确定为什么会这样。我是否正确返回了数据?
解决方案
我认为您resultsCallback
不必要地与错误处理纠缠不清
我试图用一些现代风格来清理你的例子,希望它可以帮助你
const sql = require("mssql")
const tableify = require("tableify")
/**
* FORMAT RESULTS
* - format sql records as html
* - returns a string of html
*/
function formatResults(records) {
return tableify(records)
.replace("<table>", "")
.replace("</table>", "")
}
/**
* GET DATA
* - query records from a database
* - returns a promised string of html
*/
async function getData({db, table}) {
// open the sql connection pool
const pool = await sql.connect(db)
// query the database and format the results
try {
const results = await pool.request()
.input("tablename", table)
.query(`SELECT * from @tablename`)
return formatResults(results)
}
// rethrow query errors
catch (error) {
error.message = `getData sql query error: ${error.message}`
throw error
}
// always close the connection
finally {
pool.close()
}
}
// USAGE EXAMPLE BELOW
;(async() => {
const data = await getData({
db: {
server: "server",
database: "db",
user: "user",
password: "pw"
},
table: "table"
})
console.log(data)
})().catch(error => console.error(error))
推荐阅读
- angular - 如何仅在 mat-stepper 上显示索引?
- r - R中一个时间段的平均价格
- javascript - 如果我在异步调用中省略“等待”,操作是否仍会完成?
- excel - Excel 将多个不同的表导出到 XML
- excel - 如何使用 bang 运算符解决访问 vba 代码问题
- reactjs - 为什么我的 axios POST 调度不起作用?
- visual-studio-code - 安装在其他目录中的 vscode 给出拒绝访问错误
- c# - 传递函数
作为使用反射的参数? - reactjs - React hooks - 每分钟管理 API 调用
- excel - 如何从字典中打印类