Запрос не отправлен в обещании - PullRequest
0 голосов
/ 13 ноября 2018

Я собрал воедино обещание выполнить три действия синхронно.Сначала вставьте в базу данных и разрешите идентификатор этой вставки.Во-вторых, редактирование моего объекта json, чтобы он содержал последний вставленный идентификатор из БД.И в-третьих, отправка почтового запроса с использованием запросов npm.Все это заключено в экспресс-конечную точку.

Тем не менее, вызов запросов не отправляется в мой API.Я проверил, удалил зависимости обещаний (что необходимо для получения последнего вставленного идентификатора из БД) и успешно разместил данные, используя точно такую ​​же структуру запроса.Это заставляет меня поверить, что с моим обещанием что-то не так.Кто-нибудь может помочь?

function db() {
  return new Promise(function(resolve, reject) {
     db.run(`INSERT INTO scan_requests(name, date) VALUES(?,?);`, [req.body.name,req.body.date], function(err) {
        if (err) {
           console.log(err)
        }
        let q = this.lastID
        resolve(q)
    })
  })
}

db()
  .then(function(q) {
     let data = {
        url: 'https://api/key/',
        body: {
          name: req.body.name,
          scan_callback: `http://localhost:80/${q}` 
        },
        json: true
     }
     return(data)
}).then(function(data) {
     res.json(req.body)
     request
        .post(data)
        .on('error', function(err) {
           console.log(err)
        })
        .pipe(res)      
})

1 Ответ

0 голосов
/ 13 ноября 2018

Для объединения обещаний обратный вызов разрешения (выполняется в then) должен возвращать другое обещание, поэтому вы можете связать еще одно then с первым обещанием.

Так же, как это:

function db() {
            return new Promise(function (resolve, reject) {
                const str = 'Message from first Promise'
                resolve(str)
            })
        }
        db()
            .then(function (outputFromFirstPromise) {
                return new Promise(function (resolve, reject) {
                    const somethingElse = ', and output from second promise'
                    const result = outputFromFirstPromise + somethingElse
                    resolve(result)
                })
            })
            .then(function (outputFromSecondPromise) {
                // do something with outputFromSecondPromise
            })

В вашем случае обещание посередине вообще не нужно. Зачем вам использовать обещание, только для создания вашего объекта data, если у вас нет ничего асинхронного для обработки? Просто поместите все в обратный вызов вашего первого обещания.

db().then(function (q) {
        let data = {
            url: 'https://api/key/',
            body: {
                name: req.body.name,
                scan_callback: `http://localhost:80/${q}`
            },
            json: true
        }

        res.json(req.body)
        request
            .post(data)
            .on('error', function (err) {
                console.log(err)
            })
            .pipe(res)
    })
...