【问题标题】:Node.js/Firebase: can't set headers after they're sentNode.js/Firebase:发送后无法设置标头
【发布时间】:2018-11-10 11:21:32
【问题描述】:

我们有一个带有 /api/progress POST 路由的 express.js/firebase 项目,该路由将标记作为参数,如果扫描的标记等于用户在存储故事顺序的数组中的当前进度,则将其递增。为此,我们有一个返回用户进度的 GET 路由 /api/progress。我们检查扫描标记的数量是否等于 storyOrder[userProgress](由于数组索引而减一),用户进度是从 api/progress/?user="user" 路由获取的。

Number(marker) === storyOrder[response.data.data]-1 时,我们将firebase 数据库中的进度加一。但是,当代码运行时,有时会产生以下错误:

Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:267:15)
at userDB.on.data (file:///Users/user/Documents/projects/project/routes/api.mjs:104:15)
at /Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:4465:22
at exceptionGuard (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:691:9)
at EventList.raise (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:9727:17)
at EventQueue.raiseQueuedEventsMatchingPredicate_ (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:9681:41)

这是 /api/progress GET 和 POST 路由的代码:

获取进度:

router.get('/progress', async (req, res, next) => {
let name = req.query.user || null;
console.log('Name: ',name);
let progress;
let dataList;

try {
  const getData = async data => {
    if (data.val()) {
    let tmp = await data.val();
    progress = parseInt(tmp[name].progressCounter);
    console.log(progress);
    // Return progress
    res.json({ status: 200, data: progress });
  } else {
    res.json({ status: 500, err: 'No data! ' });
  }
};

const errData = error => {
  console.error('Something went wrong.');
  console.error(error);
};

dataList = await userDB
  .orderByKey()
  .equalTo(name)
  .on('value', getData, errData);
} catch (err) {
  console.log('Error: ', err.message)
  res.json({ status: 500, err: 'Error while getting progress' });
}

});

发布进度:

router.post('/progress', async (req, res, next) => {
const user = req.session.user;
const marker = req.body.marker;
if (marker!== undefined) {
  const updateProgress = async progress => {
  let updateProg = progress.data;
  updateProg++;
  await userDB.child(user).update({ progressCounter: updateProg });
  res.json({ status: 200, marker: updateProg });
};
axios
  .get(`http://localhost:5000/api/progress?user=${user}`)
  .then(function(response) {
    console.log(storyOrder[response.data.data]-1);
    if (Number(marker) === storyOrder[response.data.data]-1) {
      updateProgress(response.data);
    } else {
      res.status(304);
      res.json({ status: 304 });
    }
  })
  .catch(function(error) {
    console.log(error);
  });
}else{
  res.json({status: 304})
}

});

【问题讨论】:

    标签: node.js firebase express


    【解决方案1】:

    您收到该错误是因为您在函数中间调用 res.send() 并且代码继续

    这段代码叫做

    const getData = async data => {
        if (data.val()) {
        let tmp = await data.val();
        progress = parseInt(tmp[name].progressCounter);
        console.log(progress);
        // Return progress
        res.json({ status: 200, data: progress });
      } else {
        res.json({ status: 500, err: 'No data! ' });
      }
    

    由于发生错误,被调用

    res.json({ status: 500, err: 'No data! ' });
    

    然后这个

    dataList = await userDB
      .orderByKey()
      .equalTo(name)
      .on('value', getData, errData);
    } catch (err) {
      console.log('Error: ', err.message)
      res.json({ status: 500, err: 'Error while getting progress' });
    }
    

    这将使用新的 res.json 再次调用第一段代码,但由于响应已经发送,您会收到该错误

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2018-03-13
      • 1970-01-01
      • 2018-05-05
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多