Цепочка обещаний со вставкой в ​​БД - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь связать воедино три запроса, которые требуют синхронизации в node.js. Вот моя попытка использования обещаний, но я получаю сообщение об ошибке, в котором говорится, что db.run не является функцией. Первое действие должно вставить в мою базу данных sqlite. Самое главное, что мне нужно, это Переменная this.lastID, в которой указывается идентификатор последнего введенного элемента. Прежде чем пытаться использовать обещания, у меня были проблемы со сферой. Это важно, потому что мне нужно взять это значение и использовать его в моем объекте JSON под ключом обратного вызова. Наконец, я использую пакет npm для отправки запроса.

Я использую библиотеку обещаний bluebird, пакет sqlite3 npm, nodejs, express.

Любая помощь с этим будет потрясающей, потому что я потерялся.

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

db()
   .then(function(q) {
      let options = {
         url: 'API',
         body: {
           name: req.name,
           scan_callback: `http://localhost:80/${q}` 
         },
         json: true
      }
      resolve(options)
   }).then(function(options) {
      console.log(options)
  })

1 Ответ

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

1-е правило "обещаний" ... всегда возвращайте свои "обещания".За исключением случаев, когда вы создаете новый.

Попробуйте это ...

app.post('/route', function (req,res) {
   new Promise(function(resolve, reject) {
      db.run(`INSERT INTO scan_requests(req.name,req.date) VALUES(?,?);`, [name,date]).then(function(result) {
         let options = {
            url: 'http://API',
            body: {
               name: req.name,
               date: req.date
               callback: `http://localhost:80/${this.lastID}`,
               }, 
             json: true
         }
         // this resolves this promise ... it is now passed on
         resolve(options);
      }).then(function(options) {
         // options is now the result from the promise
         console.log(options)
         request
            .post(options)
            .on('error', function(err) {
               console.log(err)
         })
         .pipe(res)
      });
   });
});

ОБНОВЛЕНИЕ (вопрос изменен)

Вы используете resolve(options) но разрешение там не входит (не существует).Помните первое правило обещаний ...

db()
   .then(function(q) {
      let options = {
         url: 'API',
         body: {
           name: req.name,
           scan_callback: `http://localhost:80/${q}` 
         },
         json: true
      }
      // *** change the following line ***
      // --- you must return your data ---
      return options;
   }).then(function(options) {
      console.log(options)
      // -------------------------
      // --- contrived example ---
      // -------------------------
      return { success: true };
  }).then(status => {
      console.log(`Success ${status.success}`);
  });

Этот пример содержит довольно бесполезный, но наглядный пример того, как продолжить передачу данных по "цепочке обещаний".

...