如何将Bluehost上MySQL服务器的数据传递到Heroku部署的NodeJS应用
实现方案:从Bluehost MySQL生成问答数组供Heroku NodeJS应用使用
完全可以实现你需要的逻辑,不需要Heroku端直接远程连接Bluehost MySQL,以下是两种可落地的实现路径,包含你提到的PHP实现方案:
方案1:Bluehost端PHP预生成静态JSON(最符合你的初始设想)
- 第一步:在Bluehost主机部署PHP查询脚本,直接连接本地MySQL拉取问答数据,处理后生成静态JSON文件存放到Bluehost站点的可访问路径下,参考代码如下:
<?php // 校验访问密钥,避免脚本被恶意触发 if($_GET['access_key'] != '你自定义的高强度随机密钥') die('权限不足'); // 连接Bluehost本地MySQL $conn = new mysqli('localhost', '你的数据库用户名', '你的数据库密码', '你的数据库名'); if ($conn->connect_error) die("数据库连接失败"); // 查询问答数据 $res = $conn->query("SELECT question, options, correct_answer FROM 你的问答表名"); $qaArr = []; while($row = $res->fetch_assoc()) { $qaArr[] = $row; } // 写入静态JSON文件 file_put_contents('/home/你的Bluehost账户名/public_html/qa_static.json', json_encode($qaArr, JSON_UNESCAPED_UNICODE)); $conn->close(); echo "问答数据已更新"; ?>
- 第二步:配置更新触发规则,可以在Bluehost的cPanel中设置Cron定时任务,按你的数据更新频率定时执行脚本;如果数据更新频率极低,也可以手动访问带密钥的脚本地址触发更新
- 第三步:NodeJS端获取数据,推荐选择构建时拉取模式,在Heroku的build脚本中增加拉取静态JSON的逻辑,把数据直接打包进应用,运行时完全不需要任何额外网络请求,示例build命令配置:
// package.json中的scripts配置 "scripts": { "build": "node fetch-qa.js && 你原有的build命令", "start": "node 你的应用启动文件.js" }
fetch-qa.js的参考逻辑:
const fs = require('fs'); const https = require('https'); https.get('你的Bluehost站点上qa_static.json的访问地址', (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { fs.writeFileSync('./qa-data.json', data); console.log('问答数据拉取完成'); }); });
方案2:预生成数组直接嵌入NodeJS源码
如果你的问答数据更新频率极低(周级及以上),可以直接本地连接Bluehost MySQL导出数组,写成JS模块直接放进项目部署,完全不需要任何运行时请求:
- 导出的JS模块参考格式:
// qa-data.js module.exports = [ { question: "示例问题1", options: ["选项A", "选项B", "选项C"], answer: "A" }, // 其余问答数据 ]
- 应用中直接引入使用即可:
const qaData = require('./qa-data.js')
注意事项
- 部署PHP脚本时不要泄露访问密钥,避免被恶意调用占用主机资源
- 如果静态JSON包含非公开内容,可以在Bluehost的站点配置中限制仅Heroku的出口IP可访问该JSON文件,避免数据被爬取
内容的提问来源于stack exchange,提问作者Chandler Bell
相关产品推荐
相关产品推荐

