云代码功能未使用 Parse 服务器开源 API 执行
Posted
技术标签:
【中文标题】云代码功能未使用 Parse 服务器开源 API 执行【英文标题】:Cloud code functions are not executing with Parse server open source API 【发布时间】:2016-02-21 17:23:15 【问题描述】:这是我的问题,我们正在开发一个移动应用程序,所以在 5 个月前开始时,我们使用 Parse 作为后端解决方案。现在 Parse 将在几个月内死掉,但幸运的是,我们仍然可以通过包含他们的 API 来使用 Parse 服务器。但是在 mongo 上迁移我们的数据库(在此过程中意味着很多愤怒和绝望:p)并将服务器托管在 AWS 上之后,我无法再执行我的云代码了。找不到我定义的函数,并且 Parse 仪表板不再可用,我无法检查我的云函数是否部署在服务器上。有人可以帮助我并告诉我我做错了什么吗?你们知道另一种检查云功能的方法吗? 这是我的 index.js :
var express = require('express');
var ParseServer = require('parse-server').ParseServer;
var math = require('mathjs');
var databaseUri = process.env.DATABASE_URI || process.env.MONGOLAB_URI
var app = express();
Parse.initialize('XXXXXXX', 'XXXXXX');
if (!databaseUri)
console.log('DATABASE_URI not specified, falling back to localhost.');
var api = new ParseServer(
databaseURI: databaseUri || 'XXXXXX',
cloud: './cloud/main.js',
appId: process.env.APP_ID || 'XXXXXX',
masterKey: process.env.MASTER_KEY || 'XXXXXX',
serverURL: 'http://parseserver-4w2hk-env.elasticbeanstalk.com/'
);
var mountPath = process.env.PARSE_MOUNT || '/parse';
app.use(mountPath, api);
app.get('/', function(request, response)
Parse.Cloud.run('hello');
);
还有我的 main.js(云函数):
Parse.Cloud.define('hello', function(req, res)
Parse.Cloud.httpRequest(
url: 'http://www.parse.com/',
success: function(httpResponse)
response(httpResponse.text);
,
error: function(httpResponse)
response('Request failed with response code ' + httpResponse.status)
);
);
这是日志行,它显示云功能的 404 错误:
[21/Feb/2016:16:58:56 +0000] "POST /functions/hello HTTP/1.1" 404 29 "-" "node-XMLHttpRequest, Parse/js1.7.1 (NodeJS 4.2.3)"
提前致谢! :)
【问题讨论】:
【参考方案1】:您应该能够通过 HTTP 请求调用该函数。
您是否尝试过示例云代码:
Parse.Cloud.define('hello', function(req, res)
res.success('Hello world!');
);
请注意,默认挂载路径是“/parse”,而不是 parse.com 服务中的“/1”。
对于使用curl
的测试:
curl -X POST -H "X-Parse-Application-Id: XXX" -H "X-Parse-REST-API-Key: XXX" http://<your server>/parse/functions/hello
【讨论】:
我刚刚尝试向解析网站发出一个简单的请求。我也尝试了示例代码,它没有改变任何东西。该函数根本不执行,无论内容是什么。是的,我做到了: var mountPath = process.env.PARSE_MOUNT || '/解析'; app.use(mountPath, api); 你可以先做一个console.log来检查它是否被调用,日志应该在AWS上可见(?) 我做了,如果我在云函数中做一个console.log,它不会显示(我用两个出现的console.log包围了函数调用) 直接用HTTP请求调用是否有效? 我应该使用什么 URL 来做到这一点?当我有一个解析服务器时,我设法做到了,但我现在完全不知道该怎么做【参考方案2】:使用云:__dirname+'/cloud/main.js', 而不是云:'./cloud/main.js',
【讨论】:
【参考方案3】:所以我有更多信息:当我在 serverurl/parse/functions/hello 上执行 curl POST 命令时,它可以工作,但它给了我“Hello World”作为响应,这意味着我的文件 main.js从未上传过云代码。我确定这与我的 ParseServer 配置有关,但我不知道是什么....可能是因为 replicaSet,可能还有另一种方法。
【讨论】:
【参考方案4】:是的,我不知道为什么,当我改变我们的开发环境并继续生产时,云函数被神奇地执行了,所以我克隆了那个 env,现在它正在工作,我的云函数被正确调用。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊代码的奇迹 无论如何,谢谢大家,感谢 Ilya 抽出一些时间 :)
【讨论】:
【参考方案5】:对于托管解析服务器,每次向 /cloud/main.js 添加新的云功能时都必须重新启动服务器
问候
【讨论】:
以上是关于云代码功能未使用 Parse 服务器开源 API 执行的主要内容,如果未能解决你的问题,请参考以下文章
Parse.com 云代码 afterSave() 错误:“未捕获尝试使用指向新的未保存对象的指针保存对象。”