': 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函数异步,如:

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函数的位置。

app.post的回调函数中不需要它,但在sizeOf的回调中需要它,因为这是await的包装函数

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循环中。

你最好使用这个级别的等待;

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];
}
}
}

在你的功能中,

for await (image of getImage()) {
imagelist.push(image)
}

您需要使您的函数(在其中使用await(成为异步函数。

以下是更多信息: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";
};

最新更新