部署在 Vercel 上时连接到远程数据库

Connect to remote database when deployed on Vercel

在我的 NextJS Vercel 应用程序中,在关注 Vercel's official tutorial.

之后,我无法成功连接到位于 GoDaddy 上的远程 MySQL 数据库

我希望 api 页面到 return JSON 数据库查询产生的数据。相反,我得到

我尝试更改用户名,但出于某种原因,我拥有的 4 个环境变量 - MYSQL_USER、MYSQL_DATABASE、MYSQL_HOST 和 MYSQL_PASSWORD - 从来没有在现场更新!我在 Production、Preview 甚至 Development 中进行了更改,它们在上面 link 的对象中保持不变。

我的 localhost 一切正常,因为我的家庭 IP 地址在 cPanel 中列入了白名单。但是 Vercel 有动态 IP,所以我不能在实时站点上执行此操作。如果我在 GoDaddy 上托管它也可以正常工作,但我需要在 Vercel 上托管。

这是我连接到数据库的 db.js 文件的源代码

lib/db.js

const mysql = require('serverless-mysql');

const db = mysql({
    config: {
        host: process.env.MYSQL_HOST,
        database: process.env.MYSQL_DATABASE,
        user: process.env.MYSQL_USER,
        password: process.env.MYSQL_PASSWORD,
    }
})

exports.query = async query => {
    try {
        const results = await db.query(query);
        await db.end();
        return results
    } catch (error) {
        return { 
            error
        }
    }
}

pages/api/columns/index.js

const db = require('../../../lib/db')
const escape = require('sql-template-strings')

/**
 * Queries the database to return the newspaper's columns
 * @param {IncomingMessage} _req The request object (unused)
 * @param {ServerResponse} res The response object
 */
module.exports = async (_req, res) => {
    const columns = await db.query(escape`SELECT * FROM columns ORDER BY id`);
    res.status(200).json({ columns })
}

我希望这个结果出现在本地:

连接到远程数据库仅适用于云托管(例如 Microsoft Azure、AWS)。因为我使用的是托管服务,所以这行不通。

远程MySQL,白名单%.%.%.%。因为 Vercel 的 IP 是动态的,所以这将允许 Vercel 和数据库之间的一致连接。这也是一个安全风险,但我有密码保护。