Как получить ответ после загрузки нескольких файлов? - PullRequest
0 голосов
/ 22 декабря 2019

Я пытаюсь загрузить несколько изображений и такая цель. Я создал массив с именем response, в который я отправляю любой ответ от вызова запроса, но в конце я получаю пустой массив.

router.post('/:user', upload.array('media', 100), async (req, res) => {
    const {user} = req.params;
    const files = req.files;
    if (!files) return res.status(400).json({errors: {msg: 'File missing'}});
    var response = [];
    const sql = 'INSERT INTO media (path, user, verified) VALUES (?,?,?)';
    for (var file of files) {
        await connection.query(sql, [file.originalname, user, 0], async (err, result) => {
            if (err) {
                response.push(err);
            } else {
                response.push({path: file.originalname, user: user});
            }
        });
    }
    await res.json(response);
});

1 Ответ

0 голосов
/ 22 декабря 2019

Поскольку mysql-узел не поддерживает Promise из коробки, а connection.query основан на обратном вызове. Поэтому вам нужно выполнить Promisify или вручную сделать .query обещание.

const util = require('util');

router.post('/:user', upload.array('media', 100), async (req, res) => {
  const {user} = req.params;
  const files = req.files;
  if (!files) return res.status(400).json({errors: {msg: 'File missing'}});
  var response = [];
  const sql = 'INSERT INTO media (path, user, verified) VALUES (?,?,?)';
  const promiseQuery = util.promisify(connection.query);
  for (var file of files) {  
    try{
      await promiseQuery(sql, [file.originalname, user, 0]);
      response.push({path: file.originalname, user: user})
    }catch(err){
      response.push(err);
    }
  }
  await res.json(response);
});

Но , поскольку вставки не зависят , лучше нажать наобещаю и назову Promise.all. Проверьте это для подсказок Дождитесь завершения всех обещаний, даже если некоторые отклонят


РЕДАКТИРОВАТЬ : добавление POC, который я использовал для проверки кода.

const multer = require('multer');
const util = require('util');
const bodyParser = require('body-parser');
const express = require('express');
const fs = require('fs');
const app = express();

app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
var upload = multer({ dest: 'uploads/' });
app.use(bodyParser.json());
const somePromise = util.promisify(fs.appendFile);

app.post('/:user', upload.array('media', 100), async (req, res) => {
  const { user } = req.params;
  const files = req.files;
  if (!files) return res.status(400).json({ errors: { msg: 'File missing' } });

  var response = [];
  for (var file of files) {
    const sql = `INSERT INTO media (path, user, verified) VALUES (${file.originalname}, ${user}, 0)\n`;
    try {
      await somePromise('somefile.txt', sql);
      response.push({ path: file.originalname, user: user });
    } catch (err) {
      response.push(err);
    }
  }
  await res.json(response);
});

// the port where the application run
const port = process.env.PORT || 8080;
app.listen(port, () => console.log(`Listening on port ${port}...`));

после нажатия http://localhost:8080/user Почтальоном, вот вывод:

[
    {
        "path": "Screenshot 2019-12-22 at 4.17.34 AM.png",
        "user": "user"
    },
    {
        "path": "Screenshot 2019-12-22 at 4.17.34 AM.png",
        "user": "user"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...