【发布时间】: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})
}
});
【问题讨论】: