Cześć. Mam problem z zaimplementowaniem systemu dodawania i wyświetlania zdjęcia profilowego użytkownika przechowywanego w bazie mongodb.
Stack:
- angular: frontend
- expressJS (typescript): backend
- mongoDB: baza danych
Nie wchodząc w szczegóły. Wysłanie zdjęcia z kontrolera działa, plik jest umieszczany w src/public/images, jednak z odebraniem trochę ciężej, gdyż trzeba zdefiniować ścieżkę absolutną. __dirname nie działa, ponieważ router odpowiedzialny za wywołanie zdjęcia znajduje się w src/app/controller, a jakiekolwiek próby modyfikacji tej ścieżki kończą się błędami - ścieżka musi być absolutna.
Czy ma ktoś jakieś pomysły? Gotowe przykłady? Od dwóch dni się z tym męczę i powoli dochodzę do wniosków, że express kompletnie się nie nadaje do budowy backendów.
server.ts
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static('public'))
app.get("/", async (req: Request, res: Response) => {
return res.status(200).send({ message: "EMS Server is working!" });
});
// routes
app.use(`${routePrefix}/auth`, employeeAuthController);
app.use(`${routePrefix}/employee`, employeeController);
controller.ts
router.post('/uploadImage', imageUpload.single('image'), (req:any, res:any) => {
res.send(req.file)
}, (error: any, req: any, res: any, next: any) => {
res.status(400).send({ error: error.message })
});
router.get("/avatar/:fileName", async (req: Request, res: Response) => {
res.sendFile(__dirname + '/public/images/' + req.params.fileName);
// tutaj nie wiem jak zdefiniować ścieżkę!!!
// tutaj nie wiem jak zdefiniować ścieżkę!!!
});
fileSender.ts
const imageStorage = multer.diskStorage({
destination: 'src/public/images',
filename: (req, file, cb) => {
cb(null, file.fieldname + '_' + Date.now() + path.extname(file.originalname))
}
});
export const imageUpload = multer({
storage: imageStorage,
limits: {
fileSize: 1000000 // 1000000 Bytes = 1 MB
},
fileFilter(req, file, cb) {
if (!file.originalname.match(/\.(png|jpg)$/)) {
// upload only png and jpg format
return cb(new Error('Please upload a Image'))
}
cb(undefined, true)
}
});
Z góry dzięki za pomoc!