【问题标题】:Node.js - The multi part could not be boundNode.js - 无法绑定多部分
【发布时间】:2017-09-05 07:31:33
【问题描述】:

我有一个错误(node:1152) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): RequestError: The multi-part identifier "SC1.refb" could not be bound.

在控制台日志中显示所有选择,但似乎出现在最后并给出错误。

我的代码:

return Promise.all(parts.map(function(part) {
          console.log("SELECT sc.scstamp, st.u_posic, st.fornec, st.fornecedor, sc.ref, sc.qtt, sc.design FROM sc INNER JOIN st  ON st.ref = sc.ref WHERE sc.refb = '"+kitRef+"' AND st.u_posic = '"+part.u_order+"'"+
          "UNION SELECT SC2.scstamp, st.u_posic, st.fornec, st.fornecedor, SC2.ref, SC2.qtt, SC2.design FROM sc AS SC1"+
          "INNER JOIN sc SC2 ON SC2.refb = SC1.ref INNER JOIN st  ON st.ref = SC2.ref WHERE SC1.refb = '"+kitRef+"' AND st.u_posic = '"+part.u_order+"'");
            return request.query("SELECT [sc].[scstamp], [st].[u_posic], [st].[fornec], [st].[fornecedor], [sc].[ref], [sc].[qtt], [sc].[design] FROM sc INNER JOIN st  ON st.ref = sc.ref WHERE sc.refb = '"+kitRef+"' AND st.u_posic = '"+part.u_order+"'"+
            "UNION SELECT [SC2].[scstamp], [st].[u_posic], [st].[fornec], [st].[fornecedor], [SC2].[ref], [SC2].[qtt], [SC2].[design] FROM sc AS SC1"+
            "INNER JOIN sc SC2 ON SC2.refb = SC1.ref INNER JOIN st  ON st.ref = SC2.ref WHERE SC1.refb = '"+kitRef+"' AND st.u_posic = '"+part.u_order+"'")
            .then(function(articles) {

                return {part:part, articles:articles};
            });
        }));

查询没问题,因为如果我把它放在 sql 中效果很好。

谢谢

【问题讨论】:

  • .then之后添加.catch(function(e){ console.log(e) })
  • 在 SC1.ref 和 SC1.refb 上给我错误。问题是什么? @stecb
  • @user3242861 你能发布整个堆栈跟踪吗?
  • 这是查询中的空格。解决了!谢谢@stecb
  • @user3242861 你需要认真考虑下面关于sql注入的答案中的建议

标签: javascript node.js


【解决方案1】:

您的 SQL 中似乎有一些空格搞砸了,但 这是您的问题中最少的一个。

首先,始终将拒绝处理程序附加到每个承诺,否则您的应用将因错误而崩溃。示例:

不好:

f().then(function (articles) { ... });

好:

f().then(function (articles) { ... }, function (error) { ... });

也不错:

f().then(function (articles) { ... }).catch(function (error) { ... });

查看此答案以了解其重要性:

其次,切勿将字符串与 SQL 连接,否则您将遇到 SQL 注入漏洞。示例:

糟糕、不安全、容易出错且难以维护:

connection.query(
  "SELECT * FROM player WHERE nick = '" + data.login + "' AND pass = '" + data.pass + "'",
  function (err, rows) {
    //...
  }
);

良好、安全、坚固且易于维护:

connection.query(
  "SELECT * FROM player WHERE nick = ? AND pass = ?",
  [data.login, data.pass],
  function (err, rows) {
    // ...
  }
);

有关详细信息,请参阅这些答案:

演示问题的强制性漫画:

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 2010-11-02
    • 2023-03-21
    相关资源
    最近更新 更多