【问题标题】:loosing scope of the request params in async for firestore document失去firestore文档异步请求参数的范围
【发布时间】: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


【解决方案1】:

好的,我需要做的事情很少。

1- I needed to add 
app.use(express.urlencoded());
var bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));
2- I needed to make sure that I an sending a request via x-www-form-urlencoded.

这很神奇。

【讨论】:

  • 在“request.body”中,“body”对象由body-parser中间件添加。为了加载中间件,你这样做... app.use(...)。是的,这就是 body-parser 的工作方式。如果您不告诉应用使用某些中间件,您将无法使用它。
  • 是的,我想我错过了那一点信息提示
【解决方案2】:

屏幕截图中的代码与您复制到问题中的代码不匹配。你实际上有:

await db.collection('items').doc('/'+req.body,id+'/')

请注意,“body”和“id”之间有一个逗号。错误消息告诉您名为 id 的变量未定义。

斜线在这里没有用,所以你的代码实际上应该是:

await db.collection('items').doc(req.body.id)

确保“body”和“id”之间有句号。

【讨论】:

  • 不是这样的。是一种类型。但事实并非如此。请检查更新。我发现 req.body 已定义但是 req.body.id 不可访问...不知道为什么
  • 现在我完全糊涂了,因为您在 cmets 中向我保证它“不是未定义的”。我认为目前我无能为力。
  • json 对象在 req 中,但我无法访问它的属性。没关系。谢谢你的尝试。我想我会在再调试几次后弄清楚:)
猜你喜欢
  • 2020-08-25
  • 2023-03-13
  • 1970-01-01
  • 2019-06-03
  • 2014-12-09
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多