обещание вернуть неопределенный узел js - PullRequest
0 голосов
/ 01 мая 2018

У меня есть функция, которая подключается к базе данных 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

Я не уверен, почему это происходит так. Правильно ли я вернул данные?

1 Ответ

0 голосов
/ 01 мая 2018

я думаю, что ваш 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...