我正在用Node.js和MongoDB编写一个shortenUrl API。
我正在使用一个集合来存储递增ID。
每次用户要求缩短网址时,
database
询问最新的可用号码然后进行base62转换。
但是,由于Nodejs的异步功能,获取递增ID和插入新URL对的完成时间不确定。有时,服务器会插入不带递增ID的URL对。
app.post("/" , function(req , res) {
const curLongUrl = req.body.longUrl;
const data = {
longUrl : curLongUrl,
shortUrl : ""
};
const IDurl = "https://shortenurl-rustyblade.c9users.io/";
mongo.connect(url , function(err , db) {
if(err) {
return console.log(err);
}
const increment = db.collection("autoIncrement");
increment.findOne({"function" : "incrementKey"} , function(err , docs) {
if(err) {
return console.log(err);
}
const curID = docs.increment;
console.log(curID);
const curShortUrl = IDurl + curID;
data.shortUrl = curShortUrl;
db.close();
});
});
mongo.connect(url , function(err , db) {
if(err) {
return console.log(err);
}
const col = db.collection("urlTable");
col.insert(data , function(err , document) {
if(err) {
return console.log(err);
}
console.log(JSON.stringify(data));
db.close();
res.send(JSON.stringify(data));
});
});
//res.send(JSON.stringify(data));
});
答案 0 :(得分:0)
似乎:
yourAPI("/", function () {
// ...
increment(function () {
// ...
// if increase success
urlTableInsert(..., function () {
// ...
// if insert success
db.close();
res.send(JSON.stringify(data));
})
})
})
你可以使用Promise,co或Async / await等来解决Callback Hell问题。