首页 > 解决方案 > Nodejs用MYSQL问题查询外接方法

问题描述

我做了一个连接到mysql服务器的函数,它工作正常。现在我做了其他功能来查询,但我不能这样做。我在我的 app.js 中调用了这个函数

进口:

const mysql = require("mysql");
const config = require("../configuration/config");

const connectToDB = () => {
  const connection = mysql.createConnection(config.database);
  connection.connect(err => {
    if (err) return console.log(err);
  });
  console.log("MYSQL DB CONNECTED");
};

然后我做这个功能

const getAllUserReports = userID => {
  return new Promise((resolve, reject) => {
    const reports = mysql.query(
      `SELECT reports.id,report_types.[type],companies.id as companyID,reports.[year]
      FROM reports
      INNER JOIN report_types on reports.reportTypeID=report_types.id
      INNER JOIN companies on reports.companyID=companies.id
      where reports.creatorUserID=${userID} and active_report=1
      `
    );
    resolve(reports);
    reject("Server Error");
  });
};

我在我的路线中调用第二个函数,但“mysql.query”不起作用。在 sql server 中它的工作是这样的。

还有其他方法可以吗??我不想在一次查询后连接,我想在服务器开启时连接。

标签: mysqlnode.js

解决方案


当您使用mysql npm 包时,您无法从mysql对象运行查询。connection您必须改为从对象运行它。你必须说

const reports = connection.query(/*whatever*/, function(error, results, fields) {
    /*handle query results*/
})

或承诺的等价物。否则 mysql 包不知道要使用哪个连接。

而且,相对而言,如果您的服务器持续运行任何时间,您只打开一次连接并重用它的策略注定会失败;如果连接断开,您的服务器将无法继续。

使用连接池。然后为您必须运行的每个查询从池中获取一个连接。这将连接管理置于健壮且经过调试的代码中。而且,您还将获得并发异步查询。

像这样的东西(我没有调试过)可能会起作用。

const mysql = require("mysql");
const config = require("../configuration/config");
const pool mysql.createPool(config.databaseConnectionPool);

...

let resultset;
pool.query (/*whatever*/, function (error, result, fields) {
   if (error) throw error;
   resultset = results;
});

推荐阅读