将嵌套云代码函数与 Promises 一起使用时出现 ParseError
ParseError when using Nested Cloud Code functions with Promises
我需要帮助,因为我对 Promises 有点陌生,目前正在使用 Cloud Code。我在这里检查了关于 Whosebug 的其他问题,但使用已弃用的 Parse.Promise class,它们似乎都已过时。
注意:我正在本地安装的解析服务器上工作,以便能够更轻松地测试我的云代码。
我有两个功能。
Parse.Cloud.define("getTag", async (request) => {}
Parse.Cloud.define("createTag", async (request) => {}
基本上,我调用 getTag 传递一个字符串。该函数检查标签是否存在,然后 returns 它。如果不是,它会通过调用 createTag 函数创建标签,然后 returns 新的 Tag 对象。
无论哪种方式,我都应该得到一个 Tag 对象。
我的 getTag 函数工作正常并且 returning 现有对象。但是我被卡住了,无法从 createTag 函数中获取新创建的 Tag 对象以通过 / return 传递给 getTag 函数。
尽管标签已正确创建并在我检查数据库时按预期结束在标签 Class 中,但我收到此错误:
ParseError: The server returned an invalid response.
at <path>/node_modules/parse-server/node_modules/parse/lib/node/Cloud.js:163:13
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
code: 107
}
基本上我不确定我是否return正确地从 createTag 中获取对象。
这是我的 2 个函数。任何帮助,将不胜感激。
Parse.Cloud.define("getTag", async (request) => {
console.log("===== Begin getTag ====== \n\n\n")
const Tag = Parse.Object.extend("Tag");
const query = new Parse.Query(Tag);
query.equalTo("tag", request.params.tag);
await query.first().then(
function(foundTag) {
// Check if we got an object back.
if (foundTag === undefined || foundTag === null) {
// We have to create a new one.
console.log("NO TAG FOUND:\nLet's create a new tag with - ", request.params.tag)
Parse.Cloud.run("createTag", {tag: request.params.tag}).then(function(createdTag) {
// PROBLEM IS HERE - I CAN'T get createdTag object.
return createdTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
} else {
// We found an existing Tag Object
console.log("Found an EXISTING TAG:", foundTag);
console.log("\n\n\n")
return foundTag;
}
}).catch(function(error) {
// There was an error.
console.log(error)
return error
});
});
Parse.Cloud.define("createTag", async (request) => {
console.log("n\n ===== Begin createTag ====== \n\n\n")
var tagString = request.params.tag
const TagClass = Parse.Object.extend("Tag");
const Tag = new TagClass();
Tag.set("tag", tagString);
const results = await Tag.save().then(function(newTag) {
// Execute any logic that should take place after the object is saved.
console.log("TAG CREATED:", newTag);
console.log("\n\n\n")
/*
THIS WORKS FINE. newTag object prints out
TAG CREATED: ParseObjectSubclass {
className: 'Tag',
_objCount: 3,
id: 'DOaiQGuzLB'
}
*/
return newTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
});
这是Cloud.js163
中的那一行
throw new _ParseError.default(_ParseError.default.INVALID_JSON, 'The server returned an invalid response.');
我终于弄明白了,这是一个悲伤的问题。
这一切都归结为我不了解 .then 和 async 函数如何工作的结构。我假设 .then() 中的 return 意味着整个函数的 return 。当我发现它不是时,将 return 函数链接起来就是解决方案。
我的 Parse.cloud.run("createTag") 函数本身没有 return 对象,这就是它 return 在 getTag 函数之前未定义的原因。
解决方案是在 createTag 函数的末尾添加 "return results"。
Parse.Cloud.define("createTag", async (request) => {
console.log("n\n ===== Begin createTag ====== \n\n\n")
var tagString = request.params.tag
const TagClass = Parse.Object.extend("Tag");
const Tag = new TagClass();
Tag.set("tag", tagString);
const results = await Tag.save().then(function(newTag) {
// Execute any logic that should take place after the object is saved.
console.log("TAG CREATED:", newTag);
console.log("\n\n\n")
return newTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
// ADDED THIS
return results
});
至少现在我对 async 和 promise 的工作原理有了更好的理解。我希望这能在将来为像我这样的其他新手开发者节省一些时间。
我需要帮助,因为我对 Promises 有点陌生,目前正在使用 Cloud Code。我在这里检查了关于 Whosebug 的其他问题,但使用已弃用的 Parse.Promise class,它们似乎都已过时。
注意:我正在本地安装的解析服务器上工作,以便能够更轻松地测试我的云代码。
我有两个功能。
Parse.Cloud.define("getTag", async (request) => {}
Parse.Cloud.define("createTag", async (request) => {}
基本上,我调用 getTag 传递一个字符串。该函数检查标签是否存在,然后 returns 它。如果不是,它会通过调用 createTag 函数创建标签,然后 returns 新的 Tag 对象。
无论哪种方式,我都应该得到一个 Tag 对象。
我的 getTag 函数工作正常并且 returning 现有对象。但是我被卡住了,无法从 createTag 函数中获取新创建的 Tag 对象以通过 / return 传递给 getTag 函数。
尽管标签已正确创建并在我检查数据库时按预期结束在标签 Class 中,但我收到此错误:
ParseError: The server returned an invalid response.
at <path>/node_modules/parse-server/node_modules/parse/lib/node/Cloud.js:163:13
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
code: 107
}
基本上我不确定我是否return正确地从 createTag 中获取对象。
这是我的 2 个函数。任何帮助,将不胜感激。
Parse.Cloud.define("getTag", async (request) => {
console.log("===== Begin getTag ====== \n\n\n")
const Tag = Parse.Object.extend("Tag");
const query = new Parse.Query(Tag);
query.equalTo("tag", request.params.tag);
await query.first().then(
function(foundTag) {
// Check if we got an object back.
if (foundTag === undefined || foundTag === null) {
// We have to create a new one.
console.log("NO TAG FOUND:\nLet's create a new tag with - ", request.params.tag)
Parse.Cloud.run("createTag", {tag: request.params.tag}).then(function(createdTag) {
// PROBLEM IS HERE - I CAN'T get createdTag object.
return createdTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
} else {
// We found an existing Tag Object
console.log("Found an EXISTING TAG:", foundTag);
console.log("\n\n\n")
return foundTag;
}
}).catch(function(error) {
// There was an error.
console.log(error)
return error
});
});
Parse.Cloud.define("createTag", async (request) => {
console.log("n\n ===== Begin createTag ====== \n\n\n")
var tagString = request.params.tag
const TagClass = Parse.Object.extend("Tag");
const Tag = new TagClass();
Tag.set("tag", tagString);
const results = await Tag.save().then(function(newTag) {
// Execute any logic that should take place after the object is saved.
console.log("TAG CREATED:", newTag);
console.log("\n\n\n")
/*
THIS WORKS FINE. newTag object prints out
TAG CREATED: ParseObjectSubclass {
className: 'Tag',
_objCount: 3,
id: 'DOaiQGuzLB'
}
*/
return newTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
});
这是Cloud.js163
中的那一行 throw new _ParseError.default(_ParseError.default.INVALID_JSON, 'The server returned an invalid response.');
我终于弄明白了,这是一个悲伤的问题。
这一切都归结为我不了解 .then 和 async 函数如何工作的结构。我假设 .then() 中的 return 意味着整个函数的 return 。当我发现它不是时,将 return 函数链接起来就是解决方案。
我的 Parse.cloud.run("createTag") 函数本身没有 return 对象,这就是它 return 在 getTag 函数之前未定义的原因。
解决方案是在 createTag 函数的末尾添加 "return results"。
Parse.Cloud.define("createTag", async (request) => {
console.log("n\n ===== Begin createTag ====== \n\n\n")
var tagString = request.params.tag
const TagClass = Parse.Object.extend("Tag");
const Tag = new TagClass();
Tag.set("tag", tagString);
const results = await Tag.save().then(function(newTag) {
// Execute any logic that should take place after the object is saved.
console.log("TAG CREATED:", newTag);
console.log("\n\n\n")
return newTag;
})
.catch(function(error) {
// There was an error.
console.log(error)
return error
});
// ADDED THIS
return results
});
至少现在我对 async 和 promise 的工作原理有了更好的理解。我希望这能在将来为像我这样的其他新手开发者节省一些时间。