Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 使用承诺正确处理Express错误,避免发送错误\u HTTP\u头\u_Javascript_Node.js_Express_Promise - Fatal编程技术网

Javascript 使用承诺正确处理Express错误,避免发送错误\u HTTP\u头\u

Javascript 使用承诺正确处理Express错误,避免发送错误\u HTTP\u头\u,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,因此,我一直在网上浏览大量stackoverflow帖子和文章,但似乎找不到阻止承诺并将响应返回给用户的正确方法 我目前有相关的异步承诺,承诺A需要在承诺B开始之前解决这些承诺。如果其中任何地方出现错误,我希望使用res.json()方法将不同的错误返回给客户端。不幸的是,似乎无论我在做什么,在res发送到客户端之后,就会调用catch(next),然后尝试使用不同的头将res再次发送到客户端。这会导致错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 我也

因此,我一直在网上浏览大量stackoverflow帖子和文章,但似乎找不到阻止承诺并将响应返回给用户的正确方法

我目前有相关的异步承诺,承诺A需要在承诺B开始之前解决这些承诺。如果其中任何地方出现错误,我希望使用
res.json()
方法将不同的错误返回给客户端。不幸的是,似乎无论我在做什么,在
res
发送到客户端之后,就会调用
catch(next)
,然后尝试使用不同的头将
res
再次发送到客户端。这会导致
错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头

我也尝试过使用just return语句,但这似乎只是继续到下一个
.then()
,它将传递return语句所包含的任何内容

index.js:

const errorFunc = (err, req, res, next) => {
  console.error(err);

  return res.status(500).json({ message: 'Internal error.' });
};
app.get('/scream/:screamId/like', FBAuth, likeScream, errorFunc);
处理者

exports.likeScream = (req, res, next) => {
  const likeDocument = db
    .collection('likes')
    .where('userHandle', '==', req.user.handle)
    .where('screamId', '==', req.params.screamId)
    .limit(1);

  const screamDocument = db.doc(`/screams/${req.params.screamId}`);

  return likeDocument
    .get()
    .then((data) => {
      if (!data.empty) {
        res
          .status(HttpStatus.BAD_REQUEST)
          .json({ error: 'User already liked scream' })
          .send();
        return Promise.reject(new Error('User already liked screams'));
      } else {
        return screamDocument;
      }
    })
    .then((doc) => {
      if (!doc.exists) {
        res.status(404).json({ error: 'Scream not found' }).send();
        return Promise.reject(new Error('Scream not found'));
      }
      const likeCount = doc.data().likeCount++;
      return db.doc(`/screams/${req.params.screamId}`).update({ likeCount });
    })
    .then(() => {
      const likeDetails = {
        userHandle: req.user.handle,
        screamId: req.params.screamId,
      };
      return db.collection('likes').add(likeDetails);
    })
    .then(() => {
      return res.json({ message: 'Scream liked successfully.' });
    })
    .catch(next);
};
请注意,这段代码大部分来自学习firebase和react的教程。那里的代码似乎也有这个问题


那么总体而言,发送res.sendStatus(XXX)
并停止正在进行的承诺的正确方式是什么?提前感谢。

您不能在
res.json()之后执行
res.send()
,因此我最初没有在.json()之后执行.send(),但仍然收到相同的错误。对客户端的响应仍然是{“error”:“用户已经喜欢尖叫”}。即使只使用上面编写的代码,也会抛出错误,catch块会调用
errorFunc
,它会再次尝试使用其他头发送响应。在
res.json()之后不能
res.send()。对客户端的响应仍然是{“error”:“用户已经喜欢尖叫”}。即使只使用上面编写的代码,也会抛出错误,catch块会调用
errorFunc
,它会再次尝试发送带有其他头的响应。