Загрузить файл в локальный каталог, а также MongoDB

У меня возникла проблема с загрузкой файла на компьютер и в базу данных одновременно.

Я использую два разных модуля в своем коде

  • Multer: для загрузки файла из внешнего интерфейса в p
  • CSV-to-JSON: для преобразования файла CSV в json с целью сохранения этого файла в базе данных.

Но использование двух отдельных модулей не является моим намерением. Итак, когда я попытался объединить оба модуля вместе с базовым кодом, загрузка файлов с помощью Multer работает, но я хочу загрузить этот файл в MongoDB, который должен быть решен с помощью csv-to-json, для меня проблема, похоже, не работает.

вот мой код:

var express = require('express');
var multer = require('multer');
const csv = require('csvtojson');
// Import Mongodb
const mongoClient = require('mongodb').MongoClient,
  assert = require('assert');

var filename = null;

var storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function(req, file, cb) {
    filename = Date.now() + '-' + file.originalname;
    cb(null, filename)
    console.log(filename);
  }
})

var upload = multer({
  storage: storage
})

var app = express();

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

app.post('/', upload.single('file-to-upload'), function(req, res, next) {

  // Mongodb Connection URL 
  const url = 'mongodb://localhost:27017/csvfilereader';

  // Use connect method to connect to the Server
  mongoClient.connect(url, (err, db) => {
    assert.equal(null, err);

    if (db) {
      console.log("Connected correctly to server");

      insertDocuments(db, function() {
        db.close();
      });
    } else {
      console.log('\n', 'Problem with connection', err)
    }

  });

  const insertDocuments = (db, callback) => {
    // Get the documents collection
    let collection = db.collection('uploaded');

    // CSV File Path
    const csvFilePath = 'uploads/' + filename;

    console.log(csvFilePath);
    /**
     * Read csv file and save every row of
     * data on mongodb database
     */
    csv()
      .fromFile(csvFilePath)
      .on('json', (jsonObj) => {
        collection.insert(jsonObj, (err, result) => {
          if (err) {
            console.log(err);
          } else {
            console.log('suceess');
            res.redirect('/');
            filename = null;
          }
        });
      })
      .on('done', (error) => {
        console.log('end')
      })
  }

});

app.listen(3200);

1 ответ

Вам нужно получить доступ к имени файла через переданный запрос от multer. Ваша переменная имени файла не указывает ни на какой объект.

req.file.filename даст доступ к вашему файлу, который был загружен Multer.

ОБНОВЛЕННЫЙ КОД:

var express = require("express");
var multer = require("multer");
const csv = require("csvtojson");
// Import Mongodb
const MongoClient = require("mongodb").MongoClient,
    assert = require("assert");

var filename = null;

var storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, "uploads/");
    },
    filename: function(req, file, cb) {
        filename = Date.now() + "-" + file.originalname;
        cb(null, filename);
    },
});

var upload = multer({
    storage: storage,
});

var app = express();

app.get("/", (req, res) => {
    res.sendFile(__dirname + "/index.html");
});

app.post("/", upload.single("file-to-upload"), function(req, res, next) {
    // Connection URL
    const url = "mongodb://localhost:27017";
    console.log("Multer", req.file.filename);
    // Database Name
    const dbName = "csvreader";

    // Create a new MongoClient
    const client = new MongoClient(url, { useNewUrlParser: true });

    // Use connect method to connect to the Server
    client.connect(function(err) {
        assert.equal(null, err);
        console.log("Connected successfully to database");

        const db = client.db(dbName);
        insertDocuments(db, function() {
            console.log("Closing connection");
            client.close();
        });
    });

    const insertDocuments = (db, callback) => {
        // Get the documents collection
        const collection = db.collection("uploaded");

        // CSV File Path
        const csvFilePath = "uploads/" + filename;

        console.log("Reading file from ", csvFilePath);
        /**
         * Read csv file and save every row of
         * data on mongodb database
         */
        csv()
            .fromFile(csvFilePath)
            .then(jsonObj => {
                console.log(jsonObj);
                collection.insert(jsonObj, (err, result) => {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log("suceess");
                        res.redirect("/");
                        filename = null;
                        callback();
                    }
                });
            })
            .catch(err => {
                //error reading file
                console.log(err);
            });
    };
});

app.listen(3200, () => {
    console.log("Server working at port 3200");
});
Другие вопросы по тегам