Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase.orderByChild().equalTo().once().then()承诺当child不';不存在_Javascript_Node.js_Firebase_Promise_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase.orderByChild().equalTo().once().then()承诺当child不';不存在

Javascript Firebase.orderByChild().equalTo().once().then()承诺当child不';不存在,javascript,node.js,firebase,promise,firebase-realtime-database,Javascript,Node.js,Firebase,Promise,Firebase Realtime Database,我的API/auth/login端点采用如下的req.body: { "email": "jacob@gmail.com", "password": "supersecretpassword" } router.post('/login', function(req, res, next) { const ref = db.ref('/users'); ref.orderByChild('email') .equalTo(req.body.email) .on

我的API
/auth/login
端点采用如下的
req.body

{
  "email": "jacob@gmail.com",
  "password": "supersecretpassword"
}
router.post('/login', function(req, res, next) {
  const ref = db.ref('/users');

  ref.orderByChild('email')
    .equalTo(req.body.email)
    .once('value')
    .then(function (snapshot) {
      ...
    })
    .catch(next);
});
在端点,我引用了我的Firebase数据库(
https://jacob.firebaseio.com/users
)。我搜索数据,当我发现一个用户的电子邮件与
req.body.email
匹配时,我将密码与数据库中存储的密码进行比较

我遵循概述的承诺结构

如果在
ref
处未找到任何子项,则该功能不会继续(请参阅)。我甚至没有被抛出一个错误

我的目标是在找不到使用特定电子邮件的用户时运行代码(即在
ref
中找不到满足
.equalTo(req.body.email)
要求的子项),但如果找到用户,则不运行代码。未找到任何内容时不会引发错误

我尝试在数据库调用的关键点添加
return
语句(在我的
.then()
承诺的末尾),目的是在代码运行后完全脱离端点。然后,我将代码放在对数据库的调用之后:

    .then(function (usr) {

      // Do my thing, throw any errors that come up

    })
    .catch(function (err) {

      // Handle my errors with grace

      return;
    });

  res.status(401)
    .json({
      error: 'No user found',
    )};

  return;
});
但是,无论对数据库的调用是否成功,都会运行此代码,因为调用是异步的


如果数据库没有返回任何内容并且仍然使用Firebase promises,我如何对该调用作出反应?

仅当查询与
用户
下的至少一个键匹配时,添加的
子项事件才会激发,如果存在多个匹配项,则会多次激发

您可以改为使用
事件-它只会触发一次,其快照将包含
用户
下匹配的所有键,或者如果没有匹配项,则
为空

router.post('/login', function(req, res) {
  const ref = db.ref('/users');

  ref.orderByChild('email')
    .equalTo(req.body.email)
    .once('value')
    .then(function (snapshot) {
      var value = snapshot.val();
      if (value) {
        // value is an object containing one or more of the users that matched your email query
        // choose a user and do something with it
      } else {
        res.status(401)
          .json({
            error: 'No user found',
          )};
      }
    });
});
关于错误处理,您可以按照以下方式连接承诺并表达错误处理:

{
  "email": "jacob@gmail.com",
  "password": "supersecretpassword"
}
router.post('/login', function(req, res, next) {
  const ref = db.ref('/users');

  ref.orderByChild('email')
    .equalTo(req.body.email)
    .once('value')
    .then(function (snapshot) {
      ...
    })
    .catch(next);
});