mysql - 使用 Express Node 进行多个 mysql 查询

标签 mysql node.js express

我正在运行 Express 服务器并连接到 MySQL 数据库。我有两个通过 user_id 引用的表。当用户提供电子邮件地址时,我需要查询users以查找user_id,然后运行另一个查询来加入tracking表。实现这一目标的最佳方法是什么?此外,对于代码任何部分的任何最佳实践建议,我们都会表示赞赏!

谢谢

MySQL

CREATE TABLE users (
  user_id INT NOT NULL AUTO_INCREMENT UNIQUE,
  first_name VARCHAR(100) NOT NULL,
  last_name VARCHAR(100) DEFAULT NULL,
  email VARCHAR(320) NOT NULL UNIQUE,
  date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (user_id)
);

CREATE TABLE tracking (
  tracking_id INT NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  metric VARCHAR(100) NOT NULL,
  unit VARCHAR(100) NOT NULL,
  amount DOUBLE DEFAULT NULL,
  date_tracked DATE,
  date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (tracking_id),
  INDEX user_ind (user_id),
  FOREIGN KEY (user_id)
   REFERENCES users(user_id)
   ON DELETE CASCADE
);

Express(Nodejs)

const express = require("express");
const app = express();
const port = 3000;
var mysql = require("mysql");
var connection = mysql.createConnection({
  host: "",
  user: "",
  password: "",
  database: "tracker"
});

app.get("/data/:email/metric/:metric", (req, res) => {
  console.log(req.params);
  let user_id = "";

  connection.connect();

  connection.query(
    `SELECT user_id FROM users WHERE email = '${req.params.email}';`,
    function(error, results, fields) {
      if (error) throw error;
      user_id = results[0].user_id;
    }
  );

  connection.query(
    `SELECT users.first_name, users.last_name, users.email, tracking.metric, tracking.unit, tracking.amount, tracking.date_tracked FROM users JOIN tracking ON users.user_id = tracking.user_id WHERE users.user_id = '${user_id}' AND metric = '${
      req.params.metric
    }';`,
    function(error, results, fields) {
      if (error) throw error;
      res.send(results);
    }
  );

  connection.end();
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

最佳答案

您可以通过单个查询来完成此操作,只需 JOIN user_id 上的表

SELECT 
  u.first_name, 
  u.last_name, 
  u.email, 
  t.metric, 
  t.unit, 
  t.amount, 
  t.date_tracked 
FROM users u
INNER JOIN tracking AS t ON t.user_id = u.user_id
WHERE u.email = '<email>' AND t.metric = '<metric>'

此外,FWIW 您应该使用参数化查询来保护自己免受 SQL 注入(inject)

const values = [
  req.params.email, 
  req.params.metric
];
connection.query(
  'SELECT ... WHERE u.email = ? AND t.metric = ?', 
  values, 
  (err, results, fields) => {
    if (err) return next(e); // propagate the error to Express, rather than throwing in the callback

    res.send(results);
  }
);

关于mysql - 使用 Express Node 进行多个 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53435087/

相关文章:

mysql - 在 chroot 中运行 mysql

mysql - 来自 TSV 文件的 Seed Rails 数据库 (MySQL)

javascript - API 路由在不应发生的情况下发生错误处理

javascript - 为什么在express js中间件中调用函数表达式会被提升?

php - 仅使用套接字将消息从 PHP 直接发送到 Node(没有 Redis 等)

php - Google Maps API 3 - 使用 PHP 从 MySQL DB 中提取标记

mysql - 如何创建mysql触发器来更新列

node.js - MongoDB-mongoose 不响应 REST API

node.js - 当我在 React 应用程序中使用 Heroku 配置变量时,它们返回为未定义

node.js - 如何使用 node 和 express-ws 在 websockets 中进行身份验证