GridFS- NodeJS -MongoDB: не удается прочитать свойства 'files' из неопределенного - PullRequest
0 голосов
/ 20 января 2020

Мой проект заключается в создании формы запроса на разрешение. С nodejs в качестве бэкэнда, MongoDB в качестве хранилища и e js в качестве механизма шаблонов. Я хочу создать форму, в которой пользователь может ввести детали разрешения и загрузить файл PDF. Эти данные будут храниться в базе данных MongoDB, а затем запрос о разрешении и прикрепленный файл можно будет просмотреть на панели инструментов. Проблема 1 - файл загружается, но не может быть отображен пользователю. Во-вторых, как я могу сопоставить файл PDF, загруженный конкретным пользователем, только с соответствующим запросом (пользователь может сделать несколько запросов)? Я имел в виду, могу ли я сохранить этот файл вместе с другими полями, поскольку я не хочу хранить его тогда в других коллекциях.

Я использую gfs для достижения этого, и я получаю ошибку как

Ошибка типа: не удается прочитать свойство 'files' из неопределенного кода. Это мой код

Приложение. js

const mongoURI = 'mongodb+srv://localhost:27101/test';

// Create mongo connection
const conn = mongoose.createConnection(mongoURI);

let gfs;

conn.once('open',()=>{
  gfs = Grid(conn.db,mongoose.mongo);
  gfs.collection('uploads');
});

mongoose.connect("mongodb+srv://localhost:27101/test", {
  useUnifiedTopology: true,
  useNewUrlParser: true,
  autoIndex: false
});
mongoose.set("useCreateIndex", true);



const storage = new GridFsStorage({
  url: mongoURI,
  file: (req, file) => {
    return new Promise((resolve, reject) => {
        const filename = file.originalname;
        const fileInfo = {
          filename: filename,
          bucketName: 'uploads'
        };
        resolve(fileInfo);
    });
  }
});
const upload = multer({ storage });

const requestSchema = {
  from: String,
  rollno: String,
  date: Date,
  purpose: String,
  to: [String],
  email: String,
  description: String,
  duration: String,
  current_status: [String],
};
const userSchema = new mongoose.Schema({
  googleId: {
    type: String,
    index: {
      unique: true
    }
  },
  displayName: String,
  email: String
}, {
  autoIndex: false
});

app.get('/uploads', (req, res) => {
  gfs.files.find().toArray((err, files) => {
    // Check if files
    if (!files || files.length === 0) {
      res.render('uploads', { files: false });
    } else {
      files.map(file => {
        if (
          file.contentType === 'image/jpeg' ||
          file.contentType === 'image/png'
        ) {
          file.isImage = true;
        } else {
          file.isImage = false;
        }
      });
      res.render('uploads', { files: files });
    }
  });
});

app.get("/dashboard", function(req, res) {
  request("http://localhost:3000/requests/B190257EP", function(error, response, body) {
    var data = JSON.parse(body);
    console.log(data);
    res.render("dashboard", {
      username: req.user.displayName,
      posts: data,
    });
  });
});
.post(upload.single('file'),
    function(req, res) {
      const newRequest = new Request({
        purpose: req.body.purpose,
        from: req.body.from,
        rollno: req.body.rollno,
        date: req.body.date,
        to: req.body.part,
        email: req.body.email,
        description: req.body.description,
        duration: req.body.duration,
        current_status: req.body.status
      });
      newRequest.save(function(err) {
        if (!err) {
          res.redirect("/success");
        } else {
          res.send(err);
        }
      });
    }
  );

e js

  <% if(files){ %>
            <% files.forEach(function(file) { %>
              <div class="card card-body mb-3">
                    <a href = "/files/<%= file.filename %>" target = "_blank"><%= file.filename %></a>
              </div>
              <% }) %>
                <% } else { %>
                  <p>No files to show</p>
                  <% } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...