App Engine 无法识别 JSON 文件
App Engine doesn't recognize a JSON file
我是这种平台(云)的新手,我对 App Engine 有疑问。
我在 App Engine 中有以下项目结构:
- 根目录
- nodejs-docs-samples
- 源码
- be-nodejs-piloto
- node_modules
- api.js (api post uri)
- app.js(主要)
- app.yaml
- 数据存储-quickstart.json(数据存储密钥客户端)
- 包-lock.json
- package.json
- 充满活力的树 191664
app.yaml(内容)
runtime: nodejs
env: flex
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
api.js(内容)
'use strict';
// Load libs.
var express = require('express');
var router = express.Router();
const Datastore = require('@google-cloud/datastore'); // Imports the Google Cloud client lib
// Your Google Cloud Platform project ID
const projectId = 'datastore-quickstart-191515';
const keyFilename = '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json';
console.log('keyFilename:' + keyFilename);
// Creates a client
const datastore = new Datastore({
projectId: projectId,
keyFilename: keyFilename
});
router.route('/api/piloto')
.post(function (req, res)
{
console.log('method: POST');
// Read params
var pMsgId = req.body.msgId;
const query = datastore.createQuery('MyEntity');
query.filter('msgId', '=', pMsgId);
// exec query
datastore
.runQuery(query)
.then(results => {
//OK
return res.status(200).jsonp({
"piloto":
{
"code" : 0,
"desc" : "ok",
}
});
})
.catch(err => {
console.error('ERROR:', err);
return res.status(200).jsonp({
"piloto":
{
"code" : 1,
"desc" : "error",
"errorMessage" : err.message
}
});
});
});
module.exports = router;
所以,当我发送一条 POST 消息(使用 soapUI)时,我收到了这样的回复:
{"piloto": {
"code": 1,
"desc": "error",
"errorMessage": "ENOENT: no such file or directory, open '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json'"
}}
我想 App Engine 无法识别 JSON 文件,但我不知道为什么。应该进行哪些配置?
PD。我还尝试使用 "Datastore" 构造函数设置 "GOOGLE_APPLICATION_CREDENTIALS" 环境变量而不使用 "keyFilename" 参数,我得到了相同的结果。
希望你能帮助我。
此致。
问题是这个定义:
const keyFilename = '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json';
您不能使用本地计算机的绝对文件路径,该文件系统在云计算机上不存在。您必须使用相对于您的应用程序目录的路径,该目录是应用程序 app.yaml
文件所在的路径,在您的情况下 /home/testcloud99/src/be-nodejs-piloto
,试试这个:
const keyFilename = 'datastore-quickstart.json';
请注意,我更新了文件名以及您的目录结构,其中没有 datastore-quickstart-5672f2cde8ca.json
文件。检查它是否确实是您想要的文件。
最好指出,在今年(2021 年)的官方 Google 文档中,它表示默认值为 Mac/linux
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
和Windows:
对于 PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
Replace KEY_PATH with the path of the JSON file that contains the service account key.
示例:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
对于命令提示符:
set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
Replace KEY_PATH with the path of the JSON file that contains the service account key.
基于official documentation的模型我们有这个例子
// Imports the Google Cloud client library
const {Datastore} = require('@google-cloud/datastore');
// Creates a client
const datastore = new Datastore();
async function quickstart() {
// The kind for the new entity
const kind = 'Task';
// The name/ID for the new entity
const name = 'sampletask1';
// The Cloud Datastore key for the new entity
const taskKey = datastore.key([kind, name]);
// Prepares the new entity
const task = {
key: taskKey,
data: {
description: 'Buy milk',
},
};
// Saves the entity
await datastore.save(task);
console.log(`Saved ${task.key.name}: ${task.data.description}`);
}
quickstart();
我是这种平台(云)的新手,我对 App Engine 有疑问。
我在 App Engine 中有以下项目结构:
- 根目录
- nodejs-docs-samples
- 源码
- be-nodejs-piloto
- node_modules
- api.js (api post uri)
- app.js(主要)
- app.yaml
- 数据存储-quickstart.json(数据存储密钥客户端)
- 包-lock.json
- package.json
- 充满活力的树 191664
app.yaml(内容)
runtime: nodejs
env: flex
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
api.js(内容)
'use strict';
// Load libs.
var express = require('express');
var router = express.Router();
const Datastore = require('@google-cloud/datastore'); // Imports the Google Cloud client lib
// Your Google Cloud Platform project ID
const projectId = 'datastore-quickstart-191515';
const keyFilename = '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json';
console.log('keyFilename:' + keyFilename);
// Creates a client
const datastore = new Datastore({
projectId: projectId,
keyFilename: keyFilename
});
router.route('/api/piloto')
.post(function (req, res)
{
console.log('method: POST');
// Read params
var pMsgId = req.body.msgId;
const query = datastore.createQuery('MyEntity');
query.filter('msgId', '=', pMsgId);
// exec query
datastore
.runQuery(query)
.then(results => {
//OK
return res.status(200).jsonp({
"piloto":
{
"code" : 0,
"desc" : "ok",
}
});
})
.catch(err => {
console.error('ERROR:', err);
return res.status(200).jsonp({
"piloto":
{
"code" : 1,
"desc" : "error",
"errorMessage" : err.message
}
});
});
});
module.exports = router;
所以,当我发送一条 POST 消息(使用 soapUI)时,我收到了这样的回复:
{"piloto": {
"code": 1,
"desc": "error",
"errorMessage": "ENOENT: no such file or directory, open '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json'"
}}
我想 App Engine 无法识别 JSON 文件,但我不知道为什么。应该进行哪些配置?
PD。我还尝试使用 "Datastore" 构造函数设置 "GOOGLE_APPLICATION_CREDENTIALS" 环境变量而不使用 "keyFilename" 参数,我得到了相同的结果。
希望你能帮助我。
此致。
问题是这个定义:
const keyFilename = '/home/testcloud99/src/be-nodejs-piloto/datastore-quickstart-5672f2cde8ca.json';
您不能使用本地计算机的绝对文件路径,该文件系统在云计算机上不存在。您必须使用相对于您的应用程序目录的路径,该目录是应用程序 app.yaml
文件所在的路径,在您的情况下 /home/testcloud99/src/be-nodejs-piloto
,试试这个:
const keyFilename = 'datastore-quickstart.json';
请注意,我更新了文件名以及您的目录结构,其中没有 datastore-quickstart-5672f2cde8ca.json
文件。检查它是否确实是您想要的文件。
最好指出,在今年(2021 年)的官方 Google 文档中,它表示默认值为 Mac/linux
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
和Windows:
对于 PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
Replace KEY_PATH with the path of the JSON file that contains the service account key.
示例:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
对于命令提示符:
set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
Replace KEY_PATH with the path of the JSON file that contains the service account key.
基于official documentation的模型我们有这个例子
// Imports the Google Cloud client library
const {Datastore} = require('@google-cloud/datastore');
// Creates a client
const datastore = new Datastore();
async function quickstart() {
// The kind for the new entity
const kind = 'Task';
// The name/ID for the new entity
const name = 'sampletask1';
// The Cloud Datastore key for the new entity
const taskKey = datastore.key([kind, name]);
// Prepares the new entity
const task = {
key: taskKey,
data: {
description: 'Buy milk',
},
};
// Saves the entity
await datastore.save(task);
console.log(`Saved ${task.key.name}: ${task.data.description}`);
}
quickstart();