Javascript 等待承诺在express函数中完成
我在Express中有一个post调用需要验证,因此我创建了一个名为“validator.js”的javascript文件,在继续之前检查传递的值。“validator.js”中的一个方法需要执行axios调用,但在完全填充数据之前显然需要时间。所以我用async/await解决了这个问题Javascript 等待承诺在express函数中完成,javascript,express,asynchronous,promise,axios,Javascript,Express,Asynchronous,Promise,Axios,我在Express中有一个post调用需要验证,因此我创建了一个名为“validator.js”的javascript文件,在继续之前检查传递的值。“validator.js”中的一个方法需要执行axios调用,但在完全填充数据之前显然需要时间。所以我用async/await解决了这个问题 router.post("/add_to_favorites", passport.authenticate("local"), async(req, res) => { let valida
router.post("/add_to_favorites", passport.authenticate("local"), async(req, res) =>
{ let validation = await validateMedia(req.body);
if (validation.error) {
return res.status(400).json(validation.message);
}
“validateMedia”是调用validator.js的函数。
考虑到以下代码,处理此axios异步调用的最佳方法是什么? Express
router.post("/add_to_favorites", passport.authenticate("local"), (req, res) =>
{ let validation = validateMedia(req.body);
if (validation.error) {
return res.status(400).json(validation.message);
}
}
const validateMedia = data => {
if (data.mediaType !== "movie" && data.mediaType !== "serie") {
return {
error: true,
message: "Media type is not valid"
};
}
if (data.mediaType === "movie") {
axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
if (data.mediaTitle === response.data.title) {
return { error: false, message: "Success" };
}
return { error: true, message: "Failed" };
});
}
return { error: false, message: "Checked values" };
}
validator.js
router.post("/add_to_favorites", passport.authenticate("local"), (req, res) =>
{ let validation = validateMedia(req.body);
if (validation.error) {
return res.status(400).json(validation.message);
}
}
const validateMedia = data => {
if (data.mediaType !== "movie" && data.mediaType !== "serie") {
return {
error: true,
message: "Media type is not valid"
};
}
if (data.mediaType === "movie") {
axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
if (data.mediaTitle === response.data.title) {
return { error: false, message: "Success" };
}
return { error: true, message: "Failed" };
});
}
return { error: false, message: "Checked values" };
}
您共享了有限的信息。需要了解如何定义
validateMedia
它是使用new Promise
返回承诺,还是一个async
函数?在异步等待
等待
等待承诺得到解决
阅读更多关于和的信息
根据您提供的信息,如果validateMedia
功能类似于:
承诺:
function validateMedia(data) {
// Using promise here
return new Promise ( (resolve, reject) => {
if (data.mediaType !== "movie" && data.mediaType !== "serie") {
return resolve({ // Call resolve function to return success
error: true,
message: "Media type is not valid"
});
}
if (data.mediaType === "movie") {
// This is the function needs to wait for.
axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
if (data.mediaTitle === response.data.title) {
// Call resolve function to return success
return resolve({ error: false, message: "Success" });
}
// Call reject function to return error
return reject({ error: true, message: "Failed" });
});
}
});
}
使用异步等待:
async function validateMedia(data) {
if (data.mediaType !== "movie" && data.mediaType !== "serie") {
return {
error: true,
message: "Media type is not valid"
};
}
if (data.mediaType === "movie") {
try {
// This is the function needs to wait for. if axios.get() returns a promise
let response = await axios.get(`/${data.mediaType}/${data.mediaId}`);
if (data.mediaTitle === response.data.title) {
return { error: false, message: "Success" };
}
return { error: true, message: "Failed" };
}
// If axios.get() throws error or rejects promise
catch (err) {
return { error: true, message: "Failed" };
}
}
}
这样,我不应该被限制在router.post中的异步函数中包装(req,res)吗?因为我刚刚对它进行了测试,并且只对“async(req,res)”和“wait validateMedia(req.body)”起作用。validateMedia函数只返回一个带有“error”和“message”的对象(我已经编辑了我的问题)。很抱歉信息有限,我试图避免复制/粘贴所有代码,但您请求的信息实际上很有用。