Mysql 节点和Axios-如何发出顺序请求
我需要向API发出2个请求,以便在2个不同的表中插入数据: 工作流程: 请求获取最后一个id+1=>创建我需要的数组(最后一个id,值)=>在MySql中插入两个,第一个使用varius数据,第二个使用我创建的数组。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
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