【问题标题】:Promises Node.js mysql承诺 Node.js mysql
【发布时间】:2017-05-17 20:04:53
【问题描述】:

我是 node.js 的新手,我想在我的学校项目中使用 Promise。 我在网上和堆栈上找到了一些东西:Use promise to process MySQL return value in node.js

但我有一个问题,到目前为止,这就是我所拥有的:

router.post('/matchaSearch', function(req, res) {
  var username = session.uniqueID;
  var searcherPackage = {};

  function userAgeCheck(randomParam) {
    return new Promise((resolve, reject) => {
      pool.getConnection((err, connection) => {
        var query = 'SELECT username, age, orientation, sex FROM usersinfo WHERE username != ?';
        connection.query(query, [username], (err, rows, fields) => {
          connection.release();
          return err ? reject(err) : resolve(rows);
        });
      });
    });
  }

  userAgeCheck('username')
    .then((rows) => {
      /*console.log(rows);*/
      searcherPackage = rows;
      console.log(searcherPackage);
      // do stuff
    }).catch((err) => {
      throw err;
    });
});

这对我有用,它会从数据库中返回除我(用户名)之外的所有内容。但对我来说这是不对的。为什么给一个随机参数是好的?

所以我应该将“用户名”作为参数而不是“随机参数”,但如果我这样做,查询将返回所有内容而不是除我之外的所有人(用户名)。 所以我摆脱了它,只是给了它'randomParam'并且它起作用了。 你能解释一下吗?我这样做对吗?如果是这样,我可以继续做我的项目。 非常感谢您的帮助!

【问题讨论】:

  • 引用代码中的randomParam 没有任何用途。这是你的代码,不是吗?那么它为什么会存在呢?它应该做什么?
  • 您还需要在您的pool.getConnection 回调中检查err。或者,更好的是,使用像 Bluebird 这样的库并承诺这些方法,以便您可以正确链接它们,并让任何错误自动拒绝返回的承诺。
  • 别忘了Promise.promisify 可用于将 Node.js 风格的回调方法自动转换为 Promise,因此您不必编写自己的包装器。
  • @T.J.Crowder 是的,这是我的代码,目的是从数据库中获取除我之外的所有人(用户已连接)。
  • @pkerckho:它没有达到这个目的。 username 似乎正试图达到这个目的。再说一遍:你没有在任何地方使用过randomParam,所以上面的内容完全没有意义。

标签: javascript mysql node.js


【解决方案1】:

当您调用userAgeCheck (userAgeCheck('username')) 时,您传递了一个参数:包含单词“用户名”的字符串文字。这将分配给 randomParam,然后您从不使用使其变得毫无意义。


您在脚本顶部定义一个变量:var username = session.uniqueID;

当您进行查询时,您将username 变量的值作为username != ? 的占位符值传递。

这是session.uniqueId 的值,因为它从更广泛的范围读取username 变量。

因此,除了用户名是 session.uniqueId 中的用户名的结果之外,您将返回所有结果。


如果您将randomParam 重命名为username,那么您将拥有一个名为username 的新本地变量,其值为"username"

因此,您会返回所有结果,除了用户名是用户名的结果,用户名是字面意思是 username


如果您想将用户名作为参数传递,则需要将userAgeCheck('username') 更改为userAgeCheck(username)。即用变量名替换字符串文字。

【讨论】:

  • 感谢您的回答,所以您的意思是:我的 connection.query 中的 [username] 作为我代码顶部的 var username = session.uniqueID 的值?那么当我声明函数function userAgeCheck(randomParam) 时,我应该给它任何参数吗?我为什么要这样做,哪一个?
  • @pkerckho — 如果您不打算使用参数,则不要在参数列表中定义一个,并且在调用函数时不要传递一个。如果你要使用它,那么在任何地方都使用相同的名称,并传递你想要传递的 variable 而不是字符串文字。
  • 好的,我明白了,谢谢你的帮助!我将创建十几个没有任何参数的小函数,并从我的数据库中获取所有数据并将它们放入对象中,然后以我的对象作为参数创建最后一个函数。我认为这是正确的想法!谢谢大佬!
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 2015-04-15
  • 2014-07-04
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多