使用 Google 运行 服务查询 mySQL 云 SQL 中托管的数据库时出现问题
issue in querying mySQL db hosted in Cloud SQL with Google Run service
对于一个项目,我必须在 Google Cloud SQL 实例中使用 MySQL 创建一个在线数据库实例,然后创建一个 rest API 来连接数据库实例以便查询它。
按照 Google 的教程(下面的 Link),我使用 node.js 在 Google Cloud Shell 编辑器中创建了 REST-API 作为服务.通过云 Shell 我能够构建和部署该服务,并且我创建了一个连接到它的云 运行 实例。
如果我连接到基本获取(请参阅下面的代码)它工作正常,如果我尝试从数据库中获取信息,我在 return 中什么也得不到。
url 消息 ID 为 200,查询似乎已完成或至少不会产生错误,之后我什么也没得到(如果您看到下面的代码,我们应该得到信息 return由结果变量中的查询编辑,但它是空的)。
你能帮助我了解缺少的内容吗?
这是我上面提到的脚本:
index.js
const express = require("express");
const mysql = require("mysql");
const app = express();
//pool variable
const pool = mysql.createPool({
user:'username',
password:'password',
database:'dbname',
socketpath:'the instance name given by the instance info page',
});
app.use(express.json());
const port = process.env.PORT || 8080;
app.listen(port, () =>{
console.log('oraigo rest api listening on port ${port}');
});
// function get to test on port 8080
app.get("/", async (req, res)=>{
res.json({status:"mario!!"});
});
//app get function to get from db info
app.get("/:user", async (req, res)=>{
const query = "SELECT * FROM User WHERE id_user=?";
pool.query(query, [req.params.user], (error, results)=>{
res.json(results);
/*if(!results[0]){
res.json({status:"not fuond"});
}
else{
res.json({status:"ppp"});
}*/
//res.json({status:"siamo giusti"});
});
});
package.json
{
"name": "namename",
"version": "1.0.0",
"description": "info desc",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "Gigi",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"mysql": "^2.18.1"
}
}
为此,我观看了很多来自 Google Cloud Tech Youtube 频道的视频,尤其是这个:https://www.youtube.com/watch?v=_w_idf928WY
除了我使用的是云 Shell 而不是本地编码(但应该完全相同)
我已经遵循了所有内容
提前致谢。
我认为问题在于您的 socketpath
变量未正确命名和设置。
应该命名为socketPath
而不是socketpath
,值设置为'/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>'
注意: <PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>
在示例和教程中有时也称为 INSTANCE_CONNECTION_NAME
。
因此在上下文中,您的池创建应如下所示:
const pool = mysql.createPool({
user: <YOUR_DB_USER>,
password: <YOUR_DB_PASS>,
database: <YOUR_DB_NAME>,
socketPath: '/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>',
});
因此,如果您的云 SQL 实例被命名为 mysql-instance,在区域 us-central1,在名称和 ID 为 my-cool-project 的项目中,您的套接字路径参数如下:
socketPath: '/cloudsql/my-cool-project:us-central1:mysql-instance'
P.S。如果您想直接引用,这里是您分享的视频 link 的 tutorial source code。
在创建服务期间,我设法通过在连接设置中强制连接到 SQL 数据库来使其工作。
对于一个项目,我必须在 Google Cloud SQL 实例中使用 MySQL 创建一个在线数据库实例,然后创建一个 rest API 来连接数据库实例以便查询它。 按照 Google 的教程(下面的 Link),我使用 node.js 在 Google Cloud Shell 编辑器中创建了 REST-API 作为服务.通过云 Shell 我能够构建和部署该服务,并且我创建了一个连接到它的云 运行 实例。 如果我连接到基本获取(请参阅下面的代码)它工作正常,如果我尝试从数据库中获取信息,我在 return 中什么也得不到。 url 消息 ID 为 200,查询似乎已完成或至少不会产生错误,之后我什么也没得到(如果您看到下面的代码,我们应该得到信息 return由结果变量中的查询编辑,但它是空的)。 你能帮助我了解缺少的内容吗?
这是我上面提到的脚本:
index.js
const express = require("express");
const mysql = require("mysql");
const app = express();
//pool variable
const pool = mysql.createPool({
user:'username',
password:'password',
database:'dbname',
socketpath:'the instance name given by the instance info page',
});
app.use(express.json());
const port = process.env.PORT || 8080;
app.listen(port, () =>{
console.log('oraigo rest api listening on port ${port}');
});
// function get to test on port 8080
app.get("/", async (req, res)=>{
res.json({status:"mario!!"});
});
//app get function to get from db info
app.get("/:user", async (req, res)=>{
const query = "SELECT * FROM User WHERE id_user=?";
pool.query(query, [req.params.user], (error, results)=>{
res.json(results);
/*if(!results[0]){
res.json({status:"not fuond"});
}
else{
res.json({status:"ppp"});
}*/
//res.json({status:"siamo giusti"});
});
});
package.json
{
"name": "namename",
"version": "1.0.0",
"description": "info desc",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "Gigi",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"mysql": "^2.18.1"
}
}
为此,我观看了很多来自 Google Cloud Tech Youtube 频道的视频,尤其是这个:https://www.youtube.com/watch?v=_w_idf928WY 除了我使用的是云 Shell 而不是本地编码(但应该完全相同)
我已经遵循了所有内容提前致谢。
我认为问题在于您的 socketpath
变量未正确命名和设置。
应该命名为socketPath
而不是socketpath
,值设置为'/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>'
注意: <PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>
在示例和教程中有时也称为 INSTANCE_CONNECTION_NAME
。
因此在上下文中,您的池创建应如下所示:
const pool = mysql.createPool({
user: <YOUR_DB_USER>,
password: <YOUR_DB_PASS>,
database: <YOUR_DB_NAME>,
socketPath: '/cloudsql/<PROJECT-ID>:<INSTANCE-REGION>:<INSTANCE-NAME>',
});
因此,如果您的云 SQL 实例被命名为 mysql-instance,在区域 us-central1,在名称和 ID 为 my-cool-project 的项目中,您的套接字路径参数如下:
socketPath: '/cloudsql/my-cool-project:us-central1:mysql-instance'
P.S。如果您想直接引用,这里是您分享的视频 link 的 tutorial source code。
在创建服务期间,我设法通过在连接设置中强制连接到 SQL 数据库来使其工作。