该代码用于处理Expressjs和mongodb
中的POST请求router.post('/', function(req, res){
var data = req.body;
Tag.find({name: data.name}).limit(1).exec( function(err, result){
if(err){
} else {
if(result.length > 0){ // Already exist a tag with same name
res.status(400).end('Already exist!');
} else { // Save the new Tag to database
var tag = new Tag();
tag.name = data.name;
tag.lastModifier = req.user?req.user.username:"system";
tag.lastModified = Date.now();
tag.save(function(err){
if(err){
res.status(400).json({
message: "insert tag error"
});
} else {
Tag.findOne(tag, function(err, result){
if(err){
res.status(400).json({
message: "some error.."
});
} else {
//res.status(400).end('same tag name');
res.status(201).json({
_id: result._id
});
}
});
}
});
}
}
});
});
最后9行中的楼梯太可怕了......请教我怎样才能让这个混乱更清楚?
答案 0 :(得分:1)
您可以使用命名函数而不是某些函数表达式:
router.post('/', function(req, res){
var data = req.body;
Tag.find({name: data.name}).limit(1).exec( function(err, result){
if(err){
} else {
if(result.length > 0){ // Already exist a tag with same name
res.status(400).end('Already exist!');
} else { // Save the new Tag to database
var tag = new Tag();
tag.name = data.name;
tag.lastModifier = req.user?req.user.username:"system";
tag.lastModified = Date.now();
tag.save(save(err));
}
}
});
});
function save(err){
if(err){
res.status(400).json({
message: "insert tag error"
});
} else {
Tag.findOne(tag, handleResult(err, result));
}
}
function handleResult(err, result){
if(err){
res.status(400).json({
message: "some error.."
});
} else {
//res.status(400).end('same tag name');
res.status(201).json({
_id: result._id
});
}
}
(你可以确定它们更适合这种情况,但它显示了原则。)
答案 1 :(得分:1)
router.post('/', function(req, res){
var data = req.body;
Tag.find({name: data.name}).limit(1).exec(cbExec);
});
function cbExec(err, result){
if(err){
} else {
if(result.length > 0){ // Already exist a tag with same name
res.status(400).end('Already exist!');
} else { // Save the new Tag to database
var tag = new Tag();
tag.name = data.name;
tag.lastModifier = req.user?req.user.username:"system";
tag.lastModified = Date.now();
tag.save(cbSave);
}
}
}
function cbSave(err){
if(err){
res.status(400).json({message: "insert tag error"});
} else {
Tag.findOne(tag, cbTag);
}
}
function cbTag(err, result){
if(err){
res.status(400).json({message: "some error.."});
} else {
//res.status(400).end('same tag name');
res.status(201).json({_id: result._id});
}
}
答案 2 :(得分:0)
我真的建议你尝试承诺。有许多可用于JavaScript和Node.js的实现。
一个promise基本上将异步操作封装到一个值中,这允许你摆脱这些可怕的嵌套回调。它们还允许您更轻松地链接异步操作。
您在基于回调的代码中被迫执行的操作是检查每个级别的错误,如果您的错误处理可能位于一个位置,则会变得相当繁琐。 Promise会传播错误,允许在一个地方轻松处理。
以下是一些参考资料:
调整使用它们可能需要一段时间,但相信我,绝对值得。
答案 3 :(得分:0)
你可以将鳕鱼分开一点点。而不是创建lambda函数创建正常的函数。你可以在第4行摆脱一对括号
if(err){
} else {
使用if(!err)