express.static ()에 대한 Express 미들웨어가 올바르게 라우팅되지 않고 next ()를 던지는 것은 함수가 아닙니다.

Ondrovic

내가 작성하고 테스트하는 동안 로컬 컴퓨터에서 올바르게 실행되었지만 Docker를 사용하여 UAT 환경에 배포하면 실패한 것 같습니다. 다음을 제공하는 이유를 추적 할 수없는 것 같습니다.

next() is not a function

또한 라우팅 문제가있는 것 같습니다 (배포 된 경우에만). 경로가 / media / public 인 경우에도 여전히 / media 경로에 도달 한 것처럼 보입니다.

종속성

"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1"

server.js

require('dotenv').config();
const express = require('express');
const { join } = require('path');
const { fileExists, isAuthenticated } = require('./helpers/utils');
const { PORT, ROOT_SHARE } = process.env;
const app = express();

global.__basedir = __dirname

app.use('/robots.txt', function (_req, res) {
    res.type('text/plain');
    res.send('User-agent: *\nDisallow:/');
});

app.use('/media/public', [fileExists, express.static(join(__dirname, ROOT_SHARE, '/public'))]);
app.use('/media', [isAuthenticated, express.static(join(__dirname, ROOT_SHARE))]);

app.listen(PORT, () => console.info(`[File Server] : running on ${PORT}`));

utils.js

const { existsSync } = require('fs');
const { verify } = require('jsonwebtoken');
const { join } = require('path');
const { ACCESS_SECRET, NODE_ENV  } = process.env;

const fileExists = async (req, res, next) => {
    let mediaFile = (NODE_ENV === 'local') ? join(__basedir, req.baseUrl, req.path).replace('\\src','') : req.originalUrl;
    console.log(mediaFile);
    if (!existsSync(mediaFile)) {
        console.log('NOT FOUND')
        return res.status(404).send('NOT FOUND');
    }

    return next();
}

const isAuthenticated = async (req, res, next) => {
    const accessToken = valueOrNull((req.cookies && req.cookies['x-access-token']) || (req.headers && req.headers['x-access-token']));
    
    if (!accessToken) {
        console.log('accessToken not found')
        return res.status(401).send('UNAUTHORIZED');
    }

    try {
        fileExists(req);
        const { user } = verify(accessToken, ACCESS_SECRET);

        if (user) {
            console.log('VALID USER');
        }
    } catch (err) {
        console.log(err)
        return res.status(401).send('UNAUTHORIZED');
    }

    return next();
};

const valueOrNull = (value) => {
    return (typeof value == 'undefined' || value === null || value === '') ? undefined : value;
}

module.exports = {
    fileExists,
    isAuthenticated
}

.env

ROOT_SHARE=../media

Dockerfile

FROM node:latest

RUN mkdir -p /media

WORKDIR /app

COPY package.json .
COPY package-lock.json .

RUN npm install && npm cache clean --force --loglevel=error

RUN npm install -g pm2

COPY src /app/src

EXPOSE 3000

ENTRYPOINT ["node", "src/server.js"]

정확한 오류 next ()는 함수가 아닙니다.

어떤 도움이라도 대단히 감사하겠습니다.

jfriend00

전화 :

fileExists(req);

그러나 당신의 구현은 당신이 fileExists()그것을 통과 하기를 기대 (res, res, next)하고 당신은 그것을 통과하지 않습니다. 따라서을 호출하려고 하면 오류가 next() is not a function발생 fileExists()합니다 next().

정확히 무엇을 하려는지는 분명하지 않지만, 전달 (req, res, callback)하는 곳으로 변경 fileExists()한 다음 해당 콜백에서 처리를 계속할 수 있습니다. 그것이 당신이하려는 것처럼 보이는 미들웨어를 수동으로 호출하는 방법입니다.

const isAuthenticated = (req, res, next) => {
    const accessToken = valueOrNull((req.cookies && req.cookies['x-access-token']) || (req.headers && req.headers['x-access-token']));
    
    if (!accessToken) {
        console.log('accessToken not found')
        return res.status(401).send('UNAUTHORIZED');
    }

    try {
        fileExists(req, res, () => {
            const { user } = verify(accessToken, ACCESS_SECRET);

            if (user) {
                console.log('VALID USER');
            }
            return next();

        });
    } catch (err) {
        console.log(err)
        return res.status(401).send('UNAUTHORIZED');
    }

};

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관