JavaScript承诺错误返回
我正在建设一个带有NodeJS后端的网上商店。 我有承诺,从数据库中选择USER_ID的令牌,然后我做的另一个选择从特定用户获取购物车数据:JavaScript承诺错误返回
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");
});
});
我的控制台,而不是显示我一起的结果,它显示了这个查询日志:
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: {}....
我怎样才能得到我的承诺的权利返还?
回答:
你只是没有完全承诺,代码。您首次使用query
的承诺没有问题(除return
之外没有任何作用),但是您没有完全将其应用到第二个承诺中。
除此之外:
至少有一个表面上的SQL注入风险,以及相当可能有两个,在代码;虽然你可能从上下文知道没有风险,但仍然通常值得使用API的功能来防御它。
当您在第一
query
,你在做reject(err);
取回一个错误(这是正确的)使用res[0].id
,这很可能被抛出异常,如果res
是undefined
或null
但随后继续到代码(它可能是)。虽然这是相对无害(例外将被转换为拒绝,将被忽略,因为以前的拒绝已经到位),这绝对是不正确的。 :-)你想在那里有一个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并将它们转换成承诺,指明分数的API来代替,处理这种管道为你。
重新SQL注入的警告,请参阅http://bobby-tables.com这不朽的漫画:
以上是 JavaScript承诺错误返回 的全部内容, 来源链接: utcz.com/qa/261596.html