node.js - 谷歌距离不适用于异步等待
问题描述
我正在尝试使用节点的google-distance包来计算两个城市之间的距离,一旦这个距离存储在 mongodb 数据库中,就在表单的其他字段旁边。我发现的问题是我不知道如何返回函数的值以将其存储在数据库中,并且它总是返回一个未定义的值。任何人都知道我可以在哪里失败?
removalsCtrl.createRemoval = async (req, res) => {
const { name, email, origin, destination } = req.body;
let kilometers = await distance.get({ origin, destination }, function (err, data) {
if (err) return console.log(err);
return data.distanceValue;
})
const newRemoval = await new Removal({
name,
email,
origin,
destination,
kilometers
})
await newRemoval.save();
res.json({ message: 'Removal Saved' })
};
解决方案
distance.get
不返回 Promise,因此您要么需要将其包装在一个函数中,要么将其余代码移动到回调中,即
removalsCtrl.createRemoval = async (req, res) => {
const {
name,
email,
origin,
destination
} = req.body;
const getKilometers = (origin, destination) => {
return new Promise((resolve, reject) => {
distance.get({ origin, destination }, function(err, data) {
return err ? reject(err) : resolve(data);
})
})
}
// Be sure to handle failures with this, or however you decide to do it
const kilometers = await getKilometers(origin, destination);
const newRemoval = await new Removal({
name,
email,
origin,
destination,
kilometers
})
await newRemoval.save();
res.json({
message: 'Removal Saved'
})
};
推荐阅读
- python - 将随机森林模型保存到文件?
- ios - 无法使用 segue 将数组传递给第二个视图控制器
- c - 尝试连接到已经处理请求的套接字的传入连接会发生什么?
- node.js - Laravel - 为什么节点模块加载器指的是不在我网站上的 node-sass 版本?
- hibernate - 使用 HQL JOIN 填充 JavaFX TableView 会返回奇怪的数据
- mysql - Sentencia ALTER COLUMN nombre_columna SET no funciona en MySQL
- java - JAVA:将框架和对话框放在前面
- javascript - 如何在不刷新整个页面的情况下使用 AJAX 刷新 div?
- angular - 如何修复这个 Angular 错误:参数表达式 expected.ts(1135)?
- kotlin - 可见性降低的 Kotlin / Native c 互操作