如何在router.get

时间:2019-06-01 09:00:32

标签: javascript mysql node.js express knex.js

我正在尝试使用Node,Express和JavaScript在一条路线上显示来自两个数据库表的数据。我是JavaScript的新手,尤其是Node和Express的新手。我已使用knex将Express应用程序连接到数据库,并尝试使用MySQL SELECT查询从两个表中获取数据以显示在服务器上。

“ offence_columns”表中“ column”属性/ column中的数据显示为“ offences”表中的一列,因此为什么我有两个promise,其中一个来自promise中“ column”属性的数据“ offence_columns”表,另一个在“ offences”表中选择“ area”属性,另一个是从“ columns”属性中选择的另一个属性/列。

由于“列”是MySQL中的保留字,因此在选择它时遇到了一些问题。像提供的代码中那样使用单引号为终端提供了一个代码:

  

未处理的拒绝错误:ER_PARSE_ERROR:您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ 0中的{as offences}附近使用”。

如果我用单引号代替反引号(column),则会遇到相同的错误,但是如果我尝试同时使用两者('column'),则会出现不同的错误:

  

错误:ER_BAD_FIELD_ERROR:“字段列表”中的未知列“ column”。

我尝试使用别名,但似乎无济于事。

router.get('/api/search/:offence', function(req, res, next) {
  req.db.from('offence_columns').select('column').where('pretty',"=",req.params.offence)
    .then((rows) => {
      req.db.from('offences').select('area', rows)
        .then((rows2) => {
          res.json({"Error" : false, "Message" : "Success", "City" : rows2})
        })
    })
    .catch((err) => {
      console.log(err);
      res.json({"Error" : true, "Message" : "Error in MySQL query"})
    })
});

1 个答案:

答案 0 :(得分:1)

首先,请考虑调整架构。 column是数据库列的一个非常糟糕的名称……正如您已经发现的那样,它将引起各种混乱!

但是,Knex通常在其输出中用反引号将名称引起来,这应该避免保留字的问题。这实际上不是您的问题。您所看到的是尝试发出其中包含数组的查询的结果:

req.db.from('offences').select('area', rows)

此处,rows是一个数组,可以为空也可以不为空。这是上一个查询的结果。

我怀疑您正在寻找的是这些方面的东西(做作业,因为我不知道您的架构是什么):

db.from("offence_columns")
  .select("column")
  .where("pretty", "=", req.params.offence)
  .then(rows => {
    if (rows.length === 0) {
      res.json({ error: false, message: "No cities matched." });
    }

    req.db
      .from("offences")
      // This assumes that `offence_columns` has an `area` column
      .where("area", "=", rows[0].area)
      .then(areas => {
        res.json({ Error: false, Message: "Success", city: areas[0] });
      });
  });

这里仍然存在许多问题。一方面,如果任何一个查询都可以返回多个结果怎么办?此外,最好首先加入一个连接:

db
  .select('city')
  .from('offence_columns')
  .join('offences', 'offence_columns.area', '=', 'offences.area')
  .where('pretty', '=', req.params.offence)

但是,所有这些工作都是在不知道您的架构是什么样的情况下进行的。