App Engine无法识别JSON文件

时间:2018-01-16 16:13:48

标签: node.js google-app-engine gcloud datastore

我是这种平台(云)的新手,我遇到了App Engine的问题。

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

    • 的NodeJS-文档样本
    • SRC
    • 待的NodeJS-PILOTO
      • node_modules
      • api.js(api post uri)
      • app.js(main)
      • 的app.yaml
      • datastore-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。我还尝试使用“数据存储区”构造函数设置“GOOGLE_APPLICATION_CREDENTIALS”环境变量而没有“keyFilename”参数,我得到了相同的结果。

希望你能帮助我。

问候。

2 个答案:

答案 0 :(得分:1)

问题在于这个定义:

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文件。检查它确实是你想要的文件。

答案 1 :(得分:0)

我遇到了同样的问题,我在项目的根目录下放置了一个带有凭据json的配置目录,在我的情况下,我使用了模数path

path.resolve ('./config / myJSON.json')

对于我来说,这解决了。