如何跨文件传递mysql2/promise连接对象

How to pass mysql2/promise connection object cross-file

我目前正在尝试为我的一个更大的项目制作一个基于 mysql 的登录系统。在登录和注销时,我还需要计算 xp。为此,我 运行 来自我的 index.js 的另一个文件的函数,但是 node.js returns 一个错误说 conn.query 不是一个函数. Conn.query 在我的 index.js 中工作,所以可能对象没有正确传递到函数中。我试图用 class 解决这个问题,但基本上以同样的方式失败了。这是我的文件的样子:

index.js:

const mysql2 = require('mysql2/promise');
const express = require("express");
const xp = require("./xp.js");
const app = express();
var colors = require('colors'); // console coloring


console.log("Checking database connection...".yellow); // .yellow just colors the text
try {
    conn = mysql2.createConnection({
        database: "databasename",
        host: "localhost",
        user: "root",
        password: "",
    });
} catch (err) {
    console.log(
        `${"Test failed, the following error has occured:".red} ${
            `${err.toString().split("Error: ")[1]}`.yellow
        }`
    );
}
console.log("Test successful! The database connection is valid!".green);
// ...

app.listen(port, async () => {
    xp.CalculateXp(conn, "fe417913-b0b5-4c72-9f39-0e986b830c08", "serial");
}

xp.js:

const mysql2 = require('mysql2/promise');
async function CalculateXp(conn, serial, entryLeaveID) {
    const [entryList, _fields] = await conn.query(`SELECT EntryTime,LeaveTime,EntryDate,LeaveDate,ID FROM entryleavingdata WHERE USRSERIALPRIVATE=? AND HasBeenCalculated=? AND ID=? AND organiserConfirmation=? LIMIT 1`, [serial, 0, entryLeaveID, 1]);
    const entry = entryList[0]
    // every query gives the same output
    // ....
}
module.exports = { CalculateXp };

我收到以下错误:

TypeError: conn.query is not a function
    at Object.CalculateXp (/home/name/Desktop/new/xp.js:46:45)
    at Server.<anonymous> (/home/name/Desktop/new/index.js:88:8)
    at Object.onceWrapper (node:events:641:28)
    at Server.emit (node:events:527:28)
    at emitListeningNT (node:net:1414:10)
    at processTicksAndRejections (node:internal/process/task_queues:82:21)

我在 Ubuntu 上使用节点 v17.9.0。 有什么方法可以在将两个文件分开的同时为我的函数提供正确的连接对象吗?我只需要合并文件吗?

提前致谢。

您应该在 try - let conn.

之前的某处声明 conn

现在当你尝试使用它时它是未定义的。

createConnection returns 解析为连接的 promise。您正确地将它传递给了另一个文件,但是 promises 具有 .then().catch() 等函数。在将结果发送到其他函数之前,您可能应该 await 它。