#javascript #node.js #express #filestream
#javascript #node.js #экспресс #filestream
Вопрос:
Я хочу загрузить 3 изображения на свой node.js сервер. Я отправляю эти 3 изображения в виде массива byte64 со стороны моего клиента. Поскольку это асинхронная функция, как делать это одно за другим, не выполняя одно за другим. Есть ли какой-либо способ реализовать цикл while или цикл for, кроме того, который будет ждать завершения одной записи, чтобы она могла запустить другую, если первая пройдет без ошибок? Поскольку нетрудно делать это по одному, когда всего 3 изображения, но если их 10 или более, было бы адом выполнять запись каждого файла как обратный вызов из предыдущей записи. Пожалуйста, помогите. Заранее благодарю вас.
Комментарии:
1. Просто чтобы я правильно это понял. Итак, это асинхронная функция, но вы хотите, чтобы цикл загрузки был в каком-то цикле. Таким образом, вы можете проверить, правильно ли загружено «изображение 1», а затем начать загружать «изображение 2» и т. Д. правильно? Вы должны опубликовать некоторый код о том, как вы обрабатываете вещи в серверной части в настоящее время.
2. Да, одно за другим. Я видел кое-что с promises.all, я попробую это завтра, так как на сегодня я закончил, но если у вас есть какое-либо решение, каким образом это можно было бы сделать, это было бы здорово. В настоящее время в моем серверном интерфейсе у меня есть решение для обработки одного изображения, и оно отлично работает, поскольку я управляю ответом при обратном вызове, но с несколькими изображениями, которые должны быть сохранены, это наверняка будет ад обратного вызова.
Ответ №1:
Вы можете использовать fs.promises
для обещания альтернативу fs. Затем вы можете использовать Promise.all()
для выполнения всех обещаний.
Примером может быть:
const fs = require('fs').promises;
const stuffToWrite = ["foo", "bar", "baz"];
// Create an async function
(async () => {
await Promise.all(stuffToWrite.map((value, index) => fs.writeFile(`${index}.txt`, value)));
console.log("Done!")
})();
Это создаст 3 файла, которые 0.txt , 1.txt , 2.txt . Вы можете изменить это, чтобы соответствовать тому, что вы хотите.
Согласно документам, обещание.у всех есть функция «быстрого сбоя», когда в случае сбоя одно из них отклоняется. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all )
Ответ №2:
Спасибо за ваш ответ и помощь. Я сделал это так в моем node.js после вашего комментария. Я не использовал его как асинхронную функцию, а только так. И я хочу спросить, возможно ли его использовать.затем и .catch, как я сделал. Я имею в виду, что это работает, но как это делается, чтобы получить ответ после завершения записи file stream всех файлов?
Promise.all(
images.map((value, index) =>
fs.promises.writeFile(
getPath(index),
value.base64,
"base64",
(err) => {
if (err) {
console.log(err);
} else {
console.log("done");
}
}
)
)
)
.then(() => {
res.status(200).send({ message: "data saved" });
})
.catch((err) => {
console.log(err);
res.status(404).send({ message: "something went wrong" });
});