0

我正在努力尝试将三个需要在 node.js 中同步的请求链接在一起。这是我使用 Promise 的尝试,但我收到一条错误消息,指出 db.run 不是函数。第一个动作应该插入到我的 sqlite 数据库中。我需要的最重要的东西是 this.lastID 变量,它列出了最后一个 enetered 项目的 id。在尝试使用 Promise 之前,我在范围界定方面遇到了麻烦。这很重要,因为我需要获取此值并在回调键下的 JSON 对象中使用它。最后,我使用 requests npm 包发送请求。

我正在使用 bluebird promise 库、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)
  })
4

1 回答 1

0

“承诺”的第一条规则......总是回报你的“承诺”。除非您创建一个新的。

尝试这个 ...

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)但 resolve 不在范围内(它不存在)。记住承诺的第一条规则......

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}`);
  });

该示例包括一个相当无用但说明性的示例,说明如何继续将数据沿“承诺链”传递。

于 2018-11-12T21:05:03.063 回答