我想从一个GET请求中进行2个MySQL查询,将结果编织在一起并返回它们。但是我很难将第一个查询的结果传递到下一个then()块。
const express = require('express');
const router = express.Router();
const axios = require('axios');
const con = require('../../db');
router.get('/:id', (req, res, next) => {
axios.get('/').then(docs => { //get one book by its id number
const sql = "SELECT title, line, mage_edition FROM books WHERE id=" + req.params.id;
con.query(sql, (err, result) => {
if (err) {
throw err;
}
return result; //"result" shows proper value here
});
}).then(docs => { //get all the listings that appear inside that book
//How do I get "result" here?
const sql2 = "SELECT l.entry_id, e.title, e.kind, e.sort FROM links l INNER JOIN entries e ON l.entry_id = e.id WHERE book_id=" + req.params.id;
con.query(sql2, (err, result2) => {
if (err) {
throw err;
}
//combine result and result2, then give back with res.status(200).json()
})
});
});
module.exports = router;
任何帮助将不胜感激。我完成了有关异步JavaScript的培训视频系列,但是我无法弄清楚这一点。
答案 0 :(得分:2)
问题是您的查询调用不会返回promise,而只是在完成后才调用回调。如果您使用的任何数据库库均不支持返回承诺,那么建议您为查询方法创建包装函数以返回承诺。它将使它们链接成承诺要容易得多。
类似这样的东西:
function queryPromise(con, sql) {
return new Promise((resolve, reject) => {
con.query(sql, (err, result) => {
if (err) { return reject(err); }
return resolve(result);
});
});
}
答案 1 :(得分:0)
要从一个.then
返回到下一个.then
,则应从previous
返回值。您的代码无法正常工作,因为您要从回调函数返回结果。您无法从回调函数返回值。
检查您的.query
函数是否返回任何承诺。如果是,那么您应该执行类似const result = awati con.query(sql);
的操作。
或者,您可以对.query
函数进行赋值处理,然后等待它。
答案 2 :(得分:0)
使用return
关键字返回then()
块内的结果。这应该是下一个块可用的数据。
请记住,如果需要按顺序执行then块,则需要返回一个Promise而不是已解析的值