【问题标题】:Connect to remote database when deployed on Vercel在 Vercel 上部署时连接到远程数据库
【发布时间】:2020-09-25 23:03:33
【问题描述】:

在我的 NextJS Vercel 应用程序中,在关注 Vercel's official tutorial 之后,我无法成功连接到位于 GoDaddy 上的远程 MySQL 数据库。

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

我尝试更改用户名,但由于某种原因,我拥有的 4 个环境变量 - MYSQL_USER、MYSQL_DATABASE、MYSQL_HOST 和 MYSQL_PASSWORD - 从未在实时站点上更新!我在 Production、Preview 甚至 Development 中进行了更改,它们在上述链接的对象中保持不变。

在我的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 })
}

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

【问题讨论】:

    标签: mysql next.js web-hosting remote-access vercel


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-05
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多