我是NodeJS和JavaScript的新手。我陷入了困境:
我想生成一些文字'的QR图像。在生成之后,我想查询我的MySQL数据库并将图像插入数据库。
问题是QRCode.toDataURL
模块的SOLDAIR
进入运行状态,并且在从.toDataUrl
函数返回QR图像之前调用查询。
因此导致错误。
我尝试了一切,承诺,嵌套的承诺,计数器,if语句等,但我无法找到解决方案。
我的代码:
router.post('/generateTicket', (req,res) => {
const query1 = `SELECT * FROM booking ORDER BY bookingID DESC LIMIT 1`;
const query2 = `INSERT INTO ticket (ticket_image,BookingID) SET ?`;
let bookingID;
let count;
let ticket_data = {};
Promise.using(mysql.getSqlConn(), conn => {
conn.query(query1).then(resultOfQuery1 => {
bookingID = resultOfQuery1[0].BookingID;
count = resultOfQuery1[0].PeopleCount;
console.log("ID = " + bookingID + " people count = "+count);
promiseToCreateQRcode().then(function (URLfromResolve) {
console.log("the url is " + URLfromResolve );
}).catch(function (fromReject) {
console.log("Rejected "+ fromReject);
}); // catch of promise to create QR
}).catch(err => {
res.json({ status: 500, message: 'Error Occured in query 1 ' + err });
}); // catch of query 1
});
});
var opts = {
errorCorrectionLevel: 'H',
type: 'image/png',
rendererOpts: {
quality: 0.3
}
};
let promiseToCreateQRcode = function () {
let QRImage;
return new Promise(function (resolve,reject) {
QRCode.toDataURL('text', function (err, url) {
if (err) throw err
console.log("\n"+url+"\n");
QRImage = url;
});
if (QRImage)
resolve(QRImage);
else
reject("error occured in url");
});
};
正如你所看到的,程序跳转到if语句并且还没有生成QR图像,因此它进入"拒绝":
答案 0 :(得分:0)
试试这个,
let promiseToCreateQRcode = function () {
return new Promise(function (resolve,reject) {
QRCode.toDataURL('text', function (err, url) {
if (err){
reject(err); // or some message
} else {
resolve(url);
}
});
});
};
这样,只有当 toDataURL 返回QR图像时,才会解决承诺。
答案 1 :(得分:0)
看看How do I convert an existing callback API to promises?。您需要在异步回调中调用resolve
或reject
!
function promiseToCreateQRcode() {
return new Promise(function(resolve,reject) {
QRCode.toDataURL('text', function (err, url) {
if (err) {
reject(err);
} else {
console.log("\n"+url+"\n");
resolve(url);
}
});
});
}
像cannot work一样使用这个额外的QRImage
变量。