Mysql 节点和Axios-如何发出顺序请求

Mysql 节点和Axios-如何发出顺序请求,mysql,node.js,axios,Mysql,Node.js,Axios,我需要向API发出2个请求,以便在2个不同的表中插入数据: 工作流程: 请求获取最后一个id+1=>创建我需要的数组(最后一个id,值)=>在MySql中插入两个,第一个使用varius数据,第二个使用我创建的数组。 router.post("/addentry", function (req, res) { let sql = "SELECT MAX(id) + 1 AS last_id FROM entries;"; // I get the

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

工作流程:

请求获取最后一个id+1=>创建我需要的数组(最后一个id,值)=>在MySql中插入两个,第一个使用varius数据,第二个使用我创建的数组。

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
知道怎么做吗


谢谢

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

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

您可以执行
。然后
只对承诺执行操作,这样我们就可以看到
连接。查询
不会返回承诺,因此无法执行

此外,您还多次设置响应头
res.header(“访问控制允许原点”、“*”)在请求周期中仅执行一次。因此,让我们遵循回调方法,而不是然后

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

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

接下来,在完成这项工作之后,为了能够使用
结果
对象,您将需要
JSON

您可能希望使用以下语法:

var stringify = JSON.parse(JSON.stringify(results[0]));
for (var i = 0; i < stringify.length; i++) {
    var last_id = stringify[i]["last_id"];
}
var stringify=JSON.parse(JSON.stringify(结果[0]);
对于(var i=0;i
这里是完整的解决方案,从@SubinSebastian给我的建议开始

首先,我需要的是
node-mysql2
,这是alows承诺的,因此需要链接请求

然后:

    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);
router.post(“/addentry”),函数(req,res){
让sql=“从条目中选择MAX(id)+1作为最后一个_id;”;
connection.promise().query(sql)
。然后((结果)=>{
//我从结果中得到值
var stringify=JSON.parse(JSON.stringify(结果[0]);
对于(var i=0;i{
返回[最后一个_id,项目];
});
让sql=`BEGIN;插入到条目(title,kindof)值('${[
请求正文标题,
]}“,”${req.body.kindof}”);
插入类别_main(条目_id、类别_id)值;
承诺;`;
//数组作为第二个查询参数
让query=connection.query(sql[catArray],(err,results)=>{
如果(错误)抛出错误;
});
})
.catch(console.log);

第二个错误是由于您仍在连接数据库,但正在尝试更改标头。最初已设置了标头(在您第一次检查错误后)。是的。谢谢。我认为每个查询都需要它。我对它进行了编辑以使其更简单。也许这个答案会帮助解决您的其他问题:我认为我的情况不同,我没有任何连接问题。我需要在您使用
node-mysql
node-mysql2
时发送第二个请求。谢谢,但像这样我不能我相信你说的是
catArray
。为什么你不能将它传递给第二个connection.query?而且我认为不需要传递
[catArray]
这将使它成为一个数组。我在第二个查询中传递它,因为这是我需要了解的地方。正如你所看到的代码,我确实在第二个查询中传递了它。我试图理解为什么你认为你不能将它传递给第二个查询。我不明白。我需要将该数组放到第二个查询中,或者它甚至可以是第三个查询D