I am trying to make an API endpoint called GET
where an application can resolve a file from an id if it is authenticated by the middleware authenticateUser
, the problem is that express can not seem to recognize the URL parameter id
I have tried adding the parameter in different files, for more context there is two files, a router.ts
file and download.ts
Contents of download.ts
<code>import client from "../config/database"
import { Router, Request, Response } from "express"
import authenticateUser from "../utils/auth"
async (res: Response, req: Request) => {
const fileId = req.params.id
const file = await client.query(
"SELECT userid FROM files WHERE id = $1",
if (file.rows[0].userid == req.user.id) {
res.download("../uploads/" + req.params.id)
return res.status(200).send()
return res.status(401).send()
<code>import client from "../config/database"
import { Router, Request, Response } from "express"
import authenticateUser from "../utils/auth"
const router = Router()
router.get(
"/:id",
authenticateUser,
async (res: Response, req: Request) => {
const fileId = req.params.id
const file = await client.query(
"SELECT userid FROM files WHERE id = $1",
[
fileId
]
)
if (file.rows[0].userid == req.user.id) {
res.download("../uploads/" + req.params.id)
return res.status(200).send()
} else {
return res.status(401).send()
}
}
)
export default router
</code>
import client from "../config/database"
import { Router, Request, Response } from "express"
import authenticateUser from "../utils/auth"
const router = Router()
router.get(
"/:id",
authenticateUser,
async (res: Response, req: Request) => {
const fileId = req.params.id
const file = await client.query(
"SELECT userid FROM files WHERE id = $1",
[
fileId
]
)
if (file.rows[0].userid == req.user.id) {
res.download("../uploads/" + req.params.id)
return res.status(200).send()
} else {
return res.status(401).send()
}
}
)
export default router
And contents of router.ts
<code>import { Router } from "express"
import signup from "./signup"
import login from "./login"
import upload from "./upload"
import download from "./download"
import ping from "./ping"
import new_dir from "./newDirectory"
router.use("/signup", signup)
router.use("/login", login)
router.use("/upload", upload)
router.use("/download/", download)
router.use("/ping", ping)
router.use("/new_dir", new_dir)
<code>import { Router } from "express"
import signup from "./signup"
import login from "./login"
import upload from "./upload"
import download from "./download"
import ping from "./ping"
import new_dir from "./newDirectory"
const router = Router()
router.use("/signup", signup)
router.use("/login", login)
router.use("/upload", upload)
router.use("/download/", download)
router.use("/ping", ping)
router.use("/new_dir", new_dir)
export default router
</code>
import { Router } from "express"
import signup from "./signup"
import login from "./login"
import upload from "./upload"
import download from "./download"
import ping from "./ping"
import new_dir from "./newDirectory"
const router = Router()
router.use("/signup", signup)
router.use("/login", login)
router.use("/upload", upload)
router.use("/download/", download)
router.use("/ping", ping)
router.use("/new_dir", new_dir)
export default router
As previously mentioned, I have tried adding the parameter in different files like this
I tried adding the id
parameter in router.ts
like this
<code>router.use("/download/:id", download)
<code>router.use("/download/:id", download)
</code>
router.use("/download/:id", download)
Which wasn’t recognized and is seen as undefined
And tried adding it in the download.ts
<code>router.get(
"/:id",
authenticateUser,
// Main func here
)
</code>
router.get(
"/:id",
authenticateUser,
// Main func here
)
Reading this question, I have modified the code like this in router.ts
(req, res, next) => { // Add a function to assign request params to another variable that can be read by the handler
req.parameters.fileId = 2
<code>router.use(
"/download/:id",
(req, res, next) => { // Add a function to assign request params to another variable that can be read by the handler
req.parameters = {}
req.parameters.fileId = 2
next();
},
download
)
</code>
router.use(
"/download/:id",
(req, res, next) => { // Add a function to assign request params to another variable that can be read by the handler
req.parameters = {}
req.parameters.fileId = 2
next();
},
download
)
But the error still persists stating that the variable is undefined
there is no obvious solution I can find.
Here is the full log from the terminal
<code>D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95
TypeError: Cannot read properties of undefined (reading 'fileId')
at D:Websitespicture-upload-download-platformbackendsrcroutesdownload.ts:10:35
at Layer.handle [as handle_request] (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95:5)
at next (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterroute.js:149:13)
at authenticateUser (D:Websitespicture-upload-download-platformbackendsrcutilsauth.ts:37:5)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
<code>D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95
fn(req, res, next);
^
TypeError: Cannot read properties of undefined (reading 'fileId')
at D:Websitespicture-upload-download-platformbackendsrcroutesdownload.ts:10:35
at Layer.handle [as handle_request] (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95:5)
at next (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterroute.js:149:13)
at authenticateUser (D:Websitespicture-upload-download-platformbackendsrcutilsauth.ts:37:5)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
</code>
D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95
fn(req, res, next);
^
TypeError: Cannot read properties of undefined (reading 'fileId')
at D:Websitespicture-upload-download-platformbackendsrcroutesdownload.ts:10:35
at Layer.handle [as handle_request] (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterlayer.js:95:5)
at next (D:Websitespicture-upload-download-platformbackendnode_modulesexpresslibrouterroute.js:149:13)
at authenticateUser (D:Websitespicture-upload-download-platformbackendsrcutilsauth.ts:37:5)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
Everything I have tried hasn’t worked. Sorry in advance, I am still new to asking questions so forgive me if the question is not clear or improperly formatted 🙁