我目前正在为后端和API课程做来自www.example.com的URL缩短器项目freecodecamp.org。我对这段代码有一些问题:
app.post('/api/shorturl', async (req, res, next) => {
let url = req.body.url;
let urlObj;
try {
urlObj = new URL(req.body.url);
} catch (err) {
req.err = err;
return next();
}
let hostname = urlObj.hostname;
try {
console.log("TENTATIVO URL " + url);
const address = await dns.promises.lookup(hostname);
saveUrl(url).then(() => {
console.log("url " + url);
Url.findOne({ url: url }).exec().then(
(data) => {
console.log(data);
console.log(data.get('shortUrl'));
res.json({ original_url: url, short_url: data.get('shortUrl') });
}
);
});
} catch (err) {
req.err = err;
next();
}
},
(req, res) => {
console.log(req.err);
res.json({ error: 'Invalid URL' });
});
字符串
当我尝试console.log
的Url.findOne
查询结果时,有时会显示shortUrl
字段,有时则不会。所有文档都正确保存在MongoDB数据库中,我只是不明白为什么有时查询部分失败。
下面是日志的一个示例:
的数据
下面是保存在MongoDB数据库中的文档:
的
下面是saveUrl的定义:
const saveUrl = async (originalUrl) => {
let u = new Url(
{
url: originalUrl
}
);
u.save();
};
型
1条答案
按热度按时间oxosxuxt1#
在saveUrl函数中,你不返回
u.save()
,所以你以这种方式悬挂一个promise,这就是为什么有时你会看到结果,有时不会,你不等待执行完成。字符串
或者更简洁的方式,因为如果你不使用await,就不需要async函数。
型
对您的原始代码进行了一些调整
型