【发布时间】:2020-08-30 23:44:23
【问题描述】:
我第一次尝试使用 express 的 firestore。我有这个代码
app.post('/api/create', (req, res) => {
(async () => {
try {
console.log(req.body);
//the above consle.log shows the following
// { 'id': 'HYHDHHD9', 'item': 'name' }
await db.collection('items').doc('/'+req.body.id+'/')
.create({item: req.body.item});
// req.body.id is undefined in the db.collection..why??
return res.status(200).send();
} catch (error) {
console.log(error);
return res.status(500).send(error);
}
})();
});
exports.app = functions.https.onRequest(app);
问题是,如果我在下面硬编码 req.body.id
await db.collection('items').doc('/'+req.body.id+'/') .create({item: req.body.item});
像这样
await db.collection('items').doc('testdocument') .create({item: req.body.item});
然后它工作正常,因为它不必获取 req.body 但是当我使用时(注意使用 req.body 变量)
await db.collection('items').doc('/'+req.body.id+'/') .create({item: req.body.item});
然后它显示 req.boody.id 和 req.body.item 的 undefined
我唯一的解释是不知何故我失去了 req 的上下文(范围)。如何确保它通过?
console.log 显示 api 在请求中传递参数 id 和 item 就好了。 req.body.id 和 req.body.item 在这种情况下不可用
**await db.collection('items').doc('/'+req.body.id+'/').create({item: req.body.item});**
`
****一些mroe信息**
req.body 在 db.collection 调用之前和之后都可用。
它只是在 db.collection 调用中未定义,因为它创建了一个未定义的集合名称。这就是我如何知道它正在将其拾取为未定义**
下面是一些带有console.log cmets的截图
************************ 最新编辑 ************** 好的,做了更多的调试 我得到 req.body 但我无法在 req.body 中获取参数 id。所以 req.body.id 在 req.body 之后是未定义的 使用调试 cmets 在屏幕截图中签出
【问题讨论】:
-
我很难找出不能按您期望的方式工作的代码。我认为,如果您将描述中的代码连同日志记录一起放入实际代码示例中,并使用 cmets 更好地解释什么不起作用,那么我们可以在上下文中查看所有内容。
-
我有实际的代码。涉及的日志记录不多。我想我正在失去 req 的范围
-
req 在你进入你的函数时根本不会改变,也不会逃脱范围。与您期望的不同的日志输出是什么?如果您添加更多日志记录并解释每一行的输出,这将有助于说明。
-
仍然无法正常工作。当我从 api 发送请求时,req.body.id 和 request.body.item 是未定义的。有趣的是,如果我在调用 db.collection('items',req).doc('/'+ req.body,id +'/') 之前将它们 console.log 出来,console.log 会正确选择它。创建({item: req.body.item});
-
如果您说
req.body.id本身的日志在显示 id 属性的req.body日志之后立即显示未定义,这很难相信.
标签: javascript node.js firebase express google-cloud-firestore