[英]': await is only valid in async function'
在 node.js 中,我有一个 rest api,所有上传的图片都这么大,调整大小。
调整大小图像的文件路径被编译并返回。 下面是我的代码。 我得到错误
': await is only valid in async function'
我如何调用我的等待方法? 我无法弄清楚代码。
app.post('/upload', upload.array('file'), async (req, res) => {
var imagelist = [];
for (const file of req.files) {
var sizeOf = require('image-size');
sizeOf(__basefolder + file.originalname, function (err, dimensions) {
//image quite big. resize it.
if (dimensions.width > 128 && dimensions.height > 128) {
console.log('more than 128');
// ############### ERROR LINE BELOW ##################################
const resize_2 = await resizeImage(__basefolder, file.originalname, dimensions, 2);
imagelist.push([resize_2, file.originalname]);
}
});
};
res.json(imagelist);
});
async function resizeImage(folder, fileName, dimensions, divisor) {
return "resized image file path";
};
您需要使 CB function 异步,如:
sizeOf(__basefolder + file.originalname, async (err, dimensions) => {
//image quite big. resize it.
if (dimensions.width > 128 && dimensions.height > 128) {
console.log('more than 128');
// ############### ERROR LINE BELOW ##################################
const resize_2 = await resizeImage(__basefolder, file.originalname, dimensions, 2);
imagelist.push([resize_2, file.originalname]);
}
});
您需要更改创建async
function 的位置。
在 app.post 的回调app.post
中不需要它,但是在sizeOf
的回调中需要它,因为这是您await
的包装 function
app.post('/upload', upload.array('file'), (req, res) => {
var imagelist = [];
for (const file of req.files) {
var sizeOf = require('image-size');
sizeOf(__basefolder + file.originalname, async function (err, dimensions) {
//image quite big. resize it.
if (dimensions.width > 128 && dimensions.height > 128) {
console.log('more than 128');
// ############### ERROR LINE BELOW ##################################
const resize_2 = await resizeImage(__basefolder, file.originalname, dimensions, 2);
imagelist.push([resize_2, file.originalname]);
}
});
};
res.json(imagelist);
});
async function resizeImage(folder, fileName, dimensions, divisor) {
return "resized image file path";
};
这对您来说会变得很棘手,因为您将async
包装在for...of
循环中。
你最好在那个级别使用 await ;
async function* getImage(files) {
for (file of files) {
const {
err,
dimensions
} = await sizeOf(__basefolder + file.originalname);
if (dimensions.width > 128 && dimensions.height > 128) {
console.log('more than 128');
// ############### ERROR LINE BELOW ##################################
const resize_2 = await resizeImage(__basefolder, file.originalname, dimensions, 2);
yield [resize_2, file.originalname];
}
}
}
在您的 function 中,
for await (image of getImage()) {
imagelist.push(image)
}
您需要使您的 function(在其中使用 await)成为异步 function。
这里有更多关于这个: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
喜欢:
app.post('/upload', upload.array('file'), async (req, res) => {
var imagelist = [];
for (const file of req.files) {
var sizeOf = require('image-size');
sizeOf(__basefolder + file.originalname, async function (err, dimensions) {
//image quite big. resize it.
if (dimensions.width > 128 && dimensions.height > 128) {
console.log('more than 128');
// ############### ERROR LINE BELOW ##################################
const resize_2 = await resizeImage(__basefolder, file.originalname, dimensions, 2);
imagelist.push([resize_2, file.originalname]);
}
});
};
res.json(imagelist);
});
async function resizeImage(folder, fileName, dimensions, divisor) {
return "resized image file path";
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.