gpt4 book ai didi

JavaScript Promise 错误返回

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:35 26 4
gpt4 key购买 nike

我正在构建一个带有 NodeJS 后端的网上商店。我 promise 从数据库中通过 token 选择 user_id,然后我进行另一个选择以从特定用户获取购物车数据:

 function selectItemsFromCart(userToken){
return new Promise(function(resolve, reject){
var queryString = "SELECT id FROM users WHERE token='"+userToken.token+"'";
return dbconn.query(queryString, function(err, res){
if(err){
reject(err);
}
var userId = res[0].id;
resolve(userId);
});
}).then(function(userId){
var queryString = "SELECT * FROM cart LEFT JOIN users ON cart.user_id='"+userId+"'";
return dbconn.query(queryString, function(err,res){
if(err){
return err;
}
return res;
});
});
}

当我尝试像这样将其发送回前面时:

app.use('/showCartItems', function(req, res){
selectItemsFromCart(req.body).then(function(result){
console.log(result);
res.send(result);
}).catch(function(err){
res.status(500).end("Can't load cart");
});
});

我的控制台不显示 JOIN 结果,而是显示以下查询日志:

Query {
domain: null,
_events:
{ error: [Function],
packet: [Function],
end: [Function],
timeout: [Function],
'start-tls': [Function] },
_eventsCount: 5,
_maxListeners: undefined,
_callback: [Function],
_callSite:
Error
at Protocol._enqueue (/var/www/html/Web Shop Yoon/src/node_modules/mysql/lib/protocol/Protocol.js:141:48)
at Connection.query (/var/www/html/Web Shop Yoon/src/node_modules/mysql/lib/Connection.js:214:25)
at /var/www/html/Web Shop Yoon/src/script.js:155:19
at process._tickCallback (internal/process/next_tick.js:103:7),
_ended: false,
_timeout: undefined,
_idleNext: null,
_idlePrev: null,
_idleStart: null,
_idleTimeout: -1,
_repeat: null,
sql: 'SELECT * FROM cart LEFT JOIN users ON cart.user_id=\'15\'',
values: undefined,
typeCast: true,
nestTables: false,
_resultSet: null,
_results: [],
_fields: [],
_index: 0,
_loadError: null,
_connection:
Connection {
domain: null,
_events: {}....

我怎样才能得到我的 promise 的正确返回?

最佳答案

您只是还没有完全 promise 化该代码。您第一次使用带有 query 的 Promise 是没问题的(除了不做任何事情的 return ),但您还没有完全将其应用到第二个。

除此之外:

  1. 代码中至少存在一个看似 SQL 注入(inject)的风险,而且很可能有两个;虽然您可能从上下文中知道不存在风险,但通常仍然值得使用 API 的防御功能来抵御风险。

  2. 当您在第一个查询中返回错误时,您正在执行reject(err);(这是正确的),但随后继续使用res[0].id进行编码,如果resundefinednull(很可能是),则很可能会引发异常。虽然这相对无害(异常将被转换为拒绝,该拒绝将被忽略,因为先前的拒绝已经存在),但这绝对是不对的。 :-) 你想要一个else在那里。

查看评论:

function selectItemsFromCart(userToken) {
return new Promise(function(resolve, reject) {
var queryString = "SELECT id FROM users WHERE token='" + userToken.token + "'";
// WARNING!! SQL INJECTION RISK!! ------------------^^^^^^^^^^^^^^^^^^^^^^^^^
dbconn.query(queryString, function(err, res) { // Note: No return on this line, it's not used for anything
if (err) {
reject(err);
} else { // Note else
var userId = res[0].id;
resolve(userId);
}
});
}).then(function(userId) {
// Note use of a new promise
return new Promise(function(resolve, reject) {
var queryString = "SELECT * FROM cart LEFT JOIN users ON cart.user_id='" + userId + "'";
// WARNING!! Potential SQL INJECTION RISK!! --------------------------^^^^^^^^^^^^^^^^
dbconn.query(queryString, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
});
}

或者,也有一些库使用 NodeJS 风格的回调和 err, response 参数对来获取 API,并将它们转换为 Promise 化的 API,为您处理这个管道。

<小时/>

关于SQL注入(inject)警告,请参见http://bobby-tables.com还有这部不朽的漫画:

enter image description here

关于JavaScript Promise 错误返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40069251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com