【发布时间】:2016-10-23 01:22:46
【问题描述】:
我将 node.js 与 Google App Engine 一起用于类项目。我的代码工作正常,所以我不是在问如何解决这个问题,但这太难看了,我假设必须有更好的方法让这个看起来干净。那不是我成绩的一部分,只是想知道更好的方法。也总是希望减少往返次数,所以
我已经建立了一个基本的论坛后端,但创建论坛线程的一部分是我需要检查线程具有唯一的名称以及用户是否存在。计划稍后添加身份验证,但现在只是查询名称。
如果它们属于不同的“种类”,有没有办法使用单个查询按键获取 2 个实体?像这样的嵌套查询似乎很糟糕。没有找到很多关于这个主题的文档,或者我的 google-fu 有点弱。在几个地方做这样的事情,所以特别想改进一下。
基本代码
router.post('/', function (req, res) {
if (req.body["Name"] == null || typeof req.body["Name"] !== "string")
{
res.json({ success: false, data: "Name was not a valid string." });
return;
}
if (req.body["Creator"] == null || typeof req.body["Creator"] !== "string")
{
res.json({ success: false, data: "Invalid creator submitted for thread creation." });
return;
}
//See if thread is unique
var query = datastore.createQuery('Thread')
.filter('__key__', '=', datastore.key(['Thread', req.body["Name"]]));
datastore.runQuery(query, function (err, entities, nextQuery) {
//
if (err == null && entities.length == 0) {
var query2 = datastore.createQuery('User')
.filter('__key__', '=', datastore.key(['User', req.body["Creator"]]));
datastore.runQuery(query2, function (err2, entities2, nextQuery) {
if (err2 == null && entities2.length >= 1)
{
var threadKey =
{
name: req.body["Name"],
kind: "Thread",
path: ["Thread", req.body["Name"]]
}
var threadData =
{
Creator: req.body["Creator"],
DateCreated: new Date(),
LastUpdated: new Date()
}
datastore.upsert({
key: threadKey,
data: threadData
}, function (err) {
if (err) {
res.json({ success: false, data: "Was unable to add value to datastore for unknown reason." });
return;
}
else {
res.json({ success: true, data: "Was able to add thread to datastore." });
return;
}
});
}
else
{
res.json({ success: false, data: "Cannot create thread because a valid user was not submitted." });
return;
}
});
}
else {
res.json({ success: false, data: "Cannot create thread because a matching name already exists." });
return;
}
});
});
【问题讨论】:
标签: google-app-engine google-cloud-datastore