Как передать переменную через цепочку обещаний, используя, наконец, - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать журнал для Express API, однако у меня возникают проблемы при получении данных для выхода из системы.

Я могу записать исходные объекты req и res в finally блок, но я не уверен, как я получу доступ к SQL response.

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(pool => {
    return pool.request()
      .input('username', sql.NVarChar(32), req.params.username)
      .execute('do_something_with_username')
      .then(response => res.send(response) // pass this response
      .catch(err => res.send(err))
      .finally(() => {
        console.log('response', response)  // to here
        sql.close()
      })
  })
}

Как мне взять ответ из первого блока then и передать его в блок finally для использованияв другой функции?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Функция обратного вызова finally не получит никаких аргументов, поскольку нет надежных способов определить, было ли обещание выполнено или отклонено. Этот вариант использования предназначен именно для случаев, когда вас не волнует причина отклонения или ценность выполнения, и поэтому нет необходимости предоставлять ее. ( MDN )

Вместо этого просто используйте .then:

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(pool => {
    return pool.request()
      .input('username', sql.NVarChar(32), req.params.username)
      .execute('do_something_with_username')
      .then(response => {res.send(response); return response;}) // pass this response
      .catch(err => res.send(err))
      .then(response => {
        console.log('response', response)  // to here
        sql.close()
      })
  })
}
0 голосов
/ 10 июля 2019

Фактически вы можете упростить вещи, написав свой код в асинхронной функции

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(async pool => {
    try {
        const response = await pool.request()
                         .input('username', sql.NVarChar(32), req.params.username)
                         .execute('do_something_with_username');

        // do another request
        const otherResponse = await pool.request() ... ;

        res.send(response);
    } catch (err) {
        res.send(err);
    } finally {
        sql.close();
    }
  })
}

Это позволяет писать код более линейно.

...