【发布时间】:2017-09-15 13:15:14
【问题描述】:
以下是我的代码,我首先验证用户是否存在于组中,如果存在,则将帐户推送到数组中并保存。这是通过 /addaccount 上的 POST 请求完成的。
groupRouter.post('/addaccount', Verify.verifyOrdinaryUser, function(req, res, next) {
Groups.findById(req.body.group, function(err,group) {
if (err) next(err);
var checkUser = function(user) {
for(var i=0; i<group.users.length; i++)
{
if(group.users[i]==user)
return true;
}
return false;
}
if(checkUser(req.decoded._doc._id)){
User.find({mobile:{$in:req.body.split}}, function(err, users) {
if(err) next(err); var flag = true;
if(users.length == req.body.split.length ) {
for(var i=0; i<users.length; i++) {
if(!checkUser(''+users[i]._id)) {
flag = false;
break;
}
}
if(flag) {
var myObject = {};
myObject.amount = req.body.amount;
myObject.by = req.decoded._doc._id;
myObject.split = req.body.split;
group.accounts.push(myObject);
group.save(function (err, groups) {
if(err) next(err);
console.log('Added entries');
res.json(groups);
})
}
else
res.end('All users not in the group');
}
else
res.end('Split users do not exist');
})
}
else
res.end('No Permission');
})
})
现在,当我输入一个用户数组并尝试推送一个对象并通过 代码如下:
if(flag) {
var myObject = {};
myObject.amount = req.body.amount;
myObject.by = req.decoded._doc._id;
myObject.split = req.body.split;
group.accounts.push(myObject);
group.save(function (err, groups) {
if(err) next(err);
console.log('Added entries');
res.json(groups);
})
}
我收到一条错误消息:错误:发送后无法设置标头。如下图。
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.header (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:718:10)
at ServerResponse.send (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:163:12)
at done (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:957:10)
at Object.exports.renderFile (D:\Ionic\PocketBuddies\node_modules\jade\lib\index.js:374:12)
at View.exports.__express [as engine] (D:\Ionic\PocketBuddies\node_modules\jade\lib\index.js:417:11)
at View.render (D:\Ionic\PocketBuddies\node_modules\express\lib\view.js:126:8)
at tryRender (D:\Ionic\PocketBuddies\node_modules\express\lib\application.js:639:10)
at EventEmitter.render (D:\Ionic\PocketBuddies\node_modules\express\lib\application.js:591:3)
at ServerResponse.render (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:961:7)
at D:\Ionic\PocketBuddies\app.js:78:7
at Layer.handle_error (D:\Ionic\PocketBuddies\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:310:13)
at D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:280:7
at Function.process_params (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:330:12)
at IncomingMessage.next (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:271:10)
我搜索了这个问题,它说我无法在 res.end() 之后更新响应,但是当我调用 res.json 时,我没有看到任何 res.end() 被调用。 请帮我在这里找到问题。 我正在做一个项目,这个错误让我抓狂。
提前致谢
【问题讨论】:
-
第 78 行的
D:\Ionic\PocketBuddies\app.js发生了什么?那就是触发错误。此外,您必须在您调用next(err)(所以if (err) return next(err))的每个地方从当前范围返回。我的猜测是发生了错误,您的应用正在呈现错误页面,但由于您没有返回,代码 also 会命中res.json()或res.end()(触发错误)。 -
第 78 行是我在上面调用 group.save() 的地方。
-
也感谢您的建议,将在 next() 中添加返回
-
嗯,是的,你是对的,它渲染了一个错误页面,然后还点击了 res.json(),谢谢终于得到了实际的错误!
-
您的两个循环可以简化:
var checkUser = userId => group.users.includes(userId);和var flag = users.every(user => checkUser(user._id));这也可以简化:group.accounts.push({ amount: req.body.amount, by: req.decoded._doc._id, split: req.body.split })只需插入几个换行符(不会出现在 cmets 中)跨度>
标签: javascript node.js express mongoose