App Engine 无法识别 JSON 文件

App Engine doesn't recognize a JSON file

我是这种平台(云)的新手,我对 App Engine 有疑问。

我在 App Engine 中有以下项目结构:

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();