Мой проект заключается в создании формы запроса на разрешение. С 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>
<% } %>