nodejs错误:当mysql查询参数和null错误ocurrs时,无法捕获

发布于 2025-02-11 02:27:53 字数 1712 浏览 2 评论 0 原文

中尝试... catch ,当 art null (而不是obj)时,当使用 QUERY ,它将发生无法捕获的错误,并且应用程序崩溃。

为什么可以捕获此错误?

以及

如何解决此问题以捕获,请避免应用程序崩溃?

/*
insert db
*/
function addGrabsArticle(art) {
    return new Promise((resolve, reject) => {
        pool.getConnection((err, conn) => {
            if (err) {
                resolve(null);
                return;
            }

            let sql = "insert into `archives`(`title`,`pubdate`,`type`,`cat`,`seokey`,`seodesc`,`content`,`images`,`isdel`,`ispublish`) values(?,?,?,?,?,?,?,?,?,?)";
            let params = [
                art.title,
                Date.now() + "",
                1,  // article
                2,  // coding
                art.seokey,
                art.seodesc,
                art.content,
                JSON.stringify(art.images),
                0,
                0
            ];
            conn.query(sql, params, (err, result) => {

                pool.releaseConnection(conn);

                if (err) {
                    
                    resolve(null);
                    return;
                }
                if (result.affectedRows > 0) {
                    resolve(result.insertId);
                }
                
            });
        });
    });
}
        try {
            var artObj = grabUtils.deepCopy(artlist[i]);
            var art = await grabUtils.getContent(artObj, contentProc);

            var insertId = await addGrabsArticle(art);
            
            await grabUtils.sleep(2000);
        } catch (err) {
            console.log(err);
            continue;
        }

in the try...catch, when art is null (not a obj), when insert db with query, it will ocurr a error which can not be catched, and the app crash.

why can catch this error?

and

how to fix this to be catched, avoid the app crash?

/*
insert db
*/
function addGrabsArticle(art) {
    return new Promise((resolve, reject) => {
        pool.getConnection((err, conn) => {
            if (err) {
                resolve(null);
                return;
            }

            let sql = "insert into `archives`(`title`,`pubdate`,`type`,`cat`,`seokey`,`seodesc`,`content`,`images`,`isdel`,`ispublish`) values(?,?,?,?,?,?,?,?,?,?)";
            let params = [
                art.title,
                Date.now() + "",
                1,  // article
                2,  // coding
                art.seokey,
                art.seodesc,
                art.content,
                JSON.stringify(art.images),
                0,
                0
            ];
            conn.query(sql, params, (err, result) => {

                pool.releaseConnection(conn);

                if (err) {
                    
                    resolve(null);
                    return;
                }
                if (result.affectedRows > 0) {
                    resolve(result.insertId);
                }
                
            });
        });
    });
}
        try {
            var artObj = grabUtils.deepCopy(artlist[i]);
            var art = await grabUtils.getContent(artObj, contentProc);

            var insertId = await addGrabsArticle(art);
            
            await grabUtils.sleep(2000);
        } catch (err) {
            console.log(err);
            continue;
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一抹微笑 2025-02-18 02:27:53

这是因为您正在解决诺言而不是拒绝诺言。顾名思义,解决方案会假设一切正常,当您拒绝承诺时,这将转移到您的捕获块上,因为它会在内部抛出一个例外,最终被捕获在渔获块中。

// reject here
if (err) {
   reject("Connection Failed");
   return;
}
// Reject wherever you are handling an error instead of resolve()

建议您在此处阅读有关承诺的更多信息 -

This is because you are resolving your Promise instead of Rejecting it. Resolve as the name suggests would assume everything was Ok, when you reject from your Promise this would go to your catch block as it would internally throw an Exception which is eventually caught in the Catch block.

// reject here
if (err) {
   reject("Connection Failed");
   return;
}
// Reject wherever you are handling an error instead of resolve()

Would recommend reading more about Promises here - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文