通过数据库插入将诺言链接在一起

时间:2018-11-12 20:33:06

标签: node.js express es6-promise bluebird node-sqlite3

我正在努力尝试将需要同步的三个请求链接到node.js中。这是我尝试使用Promise的尝试,但是我收到一条错误消息,说db.run不是函数。第一个动作应该插入我的sqlite数据库中。我需要的最重要的是 this.lastID变量,它列出了最后一个被枚举的项目的ID。在尝试使用Promise之前,我在范围界定方面遇到了麻烦。这很重要,因为我需要获取此值并在回调键下的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 :(得分: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),但是解决方法不在此范围内(不存在)。记住诺言的第一条规则...

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

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