当我使用 mongoose 删除功能时,它们被发送到客户端后无法设置 headers
cannot set headers after they are sent to the client when i use mongoose remove function
当我使用此代码时
activecode.remove(err => {
return res.status(500).json("error message ")
});
发送给客户端后得到错误无法设置headers
当我删除上面的代码时,它可以正常工作
这是我的代码
async activeUser(req, res, next) {
try {
const code = req.params.code;
const activecode = await ActiveCode.findOne({
code
}).gt("expire", new Date()).populate("user").limit(1).exec();
if (activecode) {
if (activecode.used) {
return res.status(400).json({
message: "از این لینک قبلا استفاده شده است"
})
} else {
activecode.used = true;
activecode.save(err => {
if (err) {
return res.status(500).json({
message: "خطایی در فعال سازی رخ داد"
})
};
});
if (activecode.user) {
activecode.user.isActive = true;
activecode.user.save(err => {
if (err) {
return res.status(500).json({
message: "خطایی در فعال سازی رخ داد"
})
};
});
const user = {
id: activecode.user.id,
name: activecode.user.name,
email: activecode.user.email,
isActive: activecode.user.isActive
}
activecode.remove(err => {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
});
return res.status(200).json({
user
});
}
}
} else {
return res.status(400).json({
message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
});
}
} catch (err) {
return res.status(500).json({
message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
});
}
}
任意
res.status.json
与 return 一起使用
我为解决这个问题所做的工作。我的代码试图发送多个响应
更改这部分代码:
activecode.remove(err => {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
});
return res.status(200).json({
user
});
有
activecode.remove((err, data) => {
if (err) {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ");
} else {
return res.status(200).json({user});
}
});
此处的问题您的请求尝试发送两次响应,这是不允许的。
希望这对您有所帮助:)
出现这种情况是因为您试图两次发送对特定请求的响应,这是不允许的。
另请注意,当他们遇到响应(res.status()。json() 或 res.send())时,您的请求路由不会完成,它将继续解析到函数的末尾,如果在解析时遇到另一个 res.send() 或 res.status()。json() 他们将抛出上述错误。
例如
app.get('/some_route',(req,res)=>{
if("condition")
res.send('something);
else
res.send('another thing');
})
app.get('/some_route',(req,res)=>{
if("condition")
res.send('something');
res.send("another something");
})
第一个例子正确,但第二个例子不正确
因为你已经有了一个带有 try/catch
的异步函数,所以你不需要使用 .save()
和 .remove()
回调。您只需要使用 await
并让 catch
为您处理错误。
这可能有帮助:
async activeUser(req, res, next) {
try {
const code = req.params.code;
const activecode = await ActiveCode.findOne({
code
}).gt("expire", new Date()).populate("user").limit(1).exec();
if (activecode) {
if (activecode.used) {
return res.status(400).json({
message: "از این لینک قبلا استفاده شده است"
})
} else {
activecode.used = true;
await activecode.save();
if (activecode.user) {
activecode.user.isActive = true;
await activecode.user.save();
const user = {
id: activecode.user.id,
name: activecode.user.name,
email: activecode.user.email,
isActive: activecode.user.isActive
}
await activecode.remove();
return res.status(200).json({
user
});
}
}
} else {
return res.status(400).json({
message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
});
}
} catch (err) {
return res.status(500).json({
message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
});
}
}
当我使用此代码时
activecode.remove(err => {
return res.status(500).json("error message ")
});
发送给客户端后得到错误无法设置headers
当我删除上面的代码时,它可以正常工作
这是我的代码
async activeUser(req, res, next) {
try {
const code = req.params.code;
const activecode = await ActiveCode.findOne({
code
}).gt("expire", new Date()).populate("user").limit(1).exec();
if (activecode) {
if (activecode.used) {
return res.status(400).json({
message: "از این لینک قبلا استفاده شده است"
})
} else {
activecode.used = true;
activecode.save(err => {
if (err) {
return res.status(500).json({
message: "خطایی در فعال سازی رخ داد"
})
};
});
if (activecode.user) {
activecode.user.isActive = true;
activecode.user.save(err => {
if (err) {
return res.status(500).json({
message: "خطایی در فعال سازی رخ داد"
})
};
});
const user = {
id: activecode.user.id,
name: activecode.user.name,
email: activecode.user.email,
isActive: activecode.user.isActive
}
activecode.remove(err => {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
});
return res.status(200).json({
user
});
}
}
} else {
return res.status(400).json({
message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
});
}
} catch (err) {
return res.status(500).json({
message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
});
}
}
任意
res.status.json
与 return 一起使用
我为解决这个问题所做的工作。我的代码试图发送多个响应
更改这部分代码:
activecode.remove(err => {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
});
return res.status(200).json({
user
});
有
activecode.remove((err, data) => {
if (err) {
return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ");
} else {
return res.status(200).json({user});
}
});
此处的问题您的请求尝试发送两次响应,这是不允许的。
希望这对您有所帮助:)
出现这种情况是因为您试图两次发送对特定请求的响应,这是不允许的。
另请注意,当他们遇到响应(res.status()。json() 或 res.send())时,您的请求路由不会完成,它将继续解析到函数的末尾,如果在解析时遇到另一个 res.send() 或 res.status()。json() 他们将抛出上述错误。
例如
app.get('/some_route',(req,res)=>{
if("condition")
res.send('something);
else
res.send('another thing');
})
app.get('/some_route',(req,res)=>{
if("condition")
res.send('something');
res.send("another something");
})
第一个例子正确,但第二个例子不正确
因为你已经有了一个带有 try/catch
的异步函数,所以你不需要使用 .save()
和 .remove()
回调。您只需要使用 await
并让 catch
为您处理错误。
这可能有帮助:
async activeUser(req, res, next) {
try {
const code = req.params.code;
const activecode = await ActiveCode.findOne({
code
}).gt("expire", new Date()).populate("user").limit(1).exec();
if (activecode) {
if (activecode.used) {
return res.status(400).json({
message: "از این لینک قبلا استفاده شده است"
})
} else {
activecode.used = true;
await activecode.save();
if (activecode.user) {
activecode.user.isActive = true;
await activecode.user.save();
const user = {
id: activecode.user.id,
name: activecode.user.name,
email: activecode.user.email,
isActive: activecode.user.isActive
}
await activecode.remove();
return res.status(200).json({
user
});
}
}
} else {
return res.status(400).json({
message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
});
}
} catch (err) {
return res.status(500).json({
message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
});
}
}