【问题标题】:Node and Axios - How to make sequentials requestsNode 和 Axios - 如何发出顺序请求
【发布时间】:2020-11-11 17:47:17
【问题描述】:

我需要向我的 API 发出 2 个请求,以便在 2 个不同的表中插入数据:

工作流程:

请求获取最后一个 id + 1 => 创建我需要的数组 (last_id, values) => MySql 中的两个 INSERT,第一个使用各种数据,第二个使用我创建的数组。

router.post("/addentry", function (req, res) {
    
let sql = "SELECT MAX(id) + 1 AS last_id FROM entries;"; // I get the id

  let query = connection
    .query(sql, (err, results) => {
      if (err) throw err;
     
     res.header("Access-Control-Allow-Origin", "*");
        
    // put the id in a variable

    var last_id = results[0].last_id;

    var categoriesMap = req.body.categories;

    var valCat = Object.values(categoriesMap);

    // I create the array with other data
 
    var catArray = valCat.map((item) => {
        return [last_id, item];
      });

    })
    .then((catArray) => {
    let sql = `BEGIN; INSERT INTO entries (title,kindof) VALUES("${[
        req.body.title,
      ]}","${req.body.kindof}");
     INSERT INTO categories_main (entry_id, cat_id) VALUES  ? ;
     COMMIT;`;

     let query = connection.query(sql, [catArray], (err, results) => {
        if (err) throw err;
        console.log(results);
        res.header("Access-Control-Allow-Origin", "*");
        res.send("Entry added to DB");
      });
    });  

第一部分效果很好,但第二部分我得到了

TypeError: connection.query(...).then is not a function

知道怎么做吗?

谢谢

【问题讨论】:

  • 您的第二个错误是由于您仍在连接到数据库,但您正在尝试更改标题。它最初已经设置(在您第一次检查错误之后)。
  • 真的。谢谢。我认为每个查询都需要它。我对其进行了编辑以使其更简单。
  • 也许这个答案会帮助你解决其他问题:answer
  • 我认为我的情况不同,我没有任何连接问题。一旦请求结束,我需要发送第二个请求
  • 你使用的是node-mysql还是node-mysql2

标签: mysql node.js axios


【解决方案1】:

首先,您应该确保使用node-mysql2 而不是node-mysql。 node-mysql2 具有内置功能,可帮助在单个连接中进行多个查询。我已经为您提供了这个answer,它举例说明了如何正确使用它。

继续前进,在您完成此操作后,为了能够使用您的 result 对象,您将需要 JSON。

您可能想要使用以下语法:

var stringify = JSON.parse(JSON.stringify(results[0]));
for (var i = 0; i < stringify.length; i++) {
    var last_id = stringify[i]["last_id"];
}

【讨论】:

    【解决方案2】:

    I need to make 2 requests to my API to insert data in 2 different table:

    从代码中,我看到您打算对服务器进行一次 API 调用并运行 2 个查询。

    您只能在 Promise 上执行 .then,因此我们可以看到 connection.query 没有返回 Promise,因此无法返回。

    您还设置了多次响应标头 res.header("Access-Control-Allow-Origin", "*"); 在请求周期中只执行一次。因此,让我们遵循回调方法而不是 then。

      let sql = "SELECT MAX(id) + 1 AS last_id FROM entries;"; // I get the id
      let query = connection
        .query(sql, (err, results) => {
          if (err) {
            
            res.header("Access-Control-Allow-Origin", "*");
            return res.status(500).send({error:'server error'});
             
         }
            
        // put the id in a variable
        var last_id = results[0].last_id;
        var categoriesMap = req.body.categories;
        var valCat = Object.values(categoriesMap);
    
        // I create the array with other data
     
        var catArray = valCat.map((item) => {
            return [last_id, item];
          });
        let sql = `BEGIN; INSERT INTO entries (title,kindof) VALUES("${[
            req.body.title,
          ]}","${req.body.kindof}");
         INSERT INTO categories_main (entry_id, cat_id) VALUES  ? ;
         COMMIT;`;
    
         let query = connection.query(sql, [catArray], (err, results) => {
            if (err) {
               res.header("Access-Control-Allow-Origin", "*");
               return res.status(500).send({error:'server error'});
            }
            console.log(results);
            res.header("Access-Control-Allow-Origin", "*");
            res.send("Entry added to DB");
          });
        })
    

    【讨论】:

    • 谢谢,但像这样我无法传递我创建的数组
    • 我相信你说的是catArray。为什么不能将它传递给第二个 connection.query ?另外我认为不需要传递[catArray],这将使其成为数组数组
    • 我将它传递给第二个查询原因是我需要它
    • 明白这一点。如您所见,我确实在第二个查询中传递了该代码。我试图理解为什么你认为你不能将它传递给第二个查询。
    • 我不明白。我需要将该数组放入第二个查询中,或者它甚至可以是第三个。
    【解决方案3】:

    这里是完整的解决方案,从@SubinSebastian 给我的建议开始。

    首先我需要node-mysql2,它允许承诺并因此链接请求。

    然后:

        router.post("/addentry", function (req, res) {
         
         let sql = "SELECT MAX(id) + 1 AS last_id FROM entries;";
        
          connection.promise().query(sql)
            .then((results) => {
            
        
              // I get the value from results
              var stringify = JSON.parse(JSON.stringify(results[0]));
              for (var i = 0; i < stringify.length; i++) {
                console.log(stringify[i]["last_id"]);
                var last_id = stringify[i]["last_id"];
              }
        
    
              // I get some parameters and I create the array
              
              var categoriesMap = req.body.categories;
        
              var valCat = Object.values(categoriesMap);
        
              var catArray = valCat.map((item) => {
                return [last_id, item];
              });
        
        
              let sql = `BEGIN; INSERT INTO entries (title,kindof) VALUES("${[
                req.body.title,
              ]}","${req.body.kindof}");
        
             INSERT INTO categories_main (entry_id, cat_id) VALUES  ? ;
        
             COMMIT;`;
    
        // array as second query parameter
    
              let query = connection.query(sql, [catArray], (err,results) => {
                if (err) throw err;     
              });
            })
            .catch(console.log);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2022-11-02
      • 2011-08-28
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多