Экспресс связующее ПО звонит несколько раз - PullRequest
0 голосов
/ 10 февраля 2019

Я проверил другие сообщения, связанные с этой темой, и не смог найти проблему в своем коде.

const myMiddleware = (fn) => {
    return (req, res, next) => {
        var fullUrl = req.protocol + '://' + req.get('host') + req.url;
        console.log(fullUrl)
        next()
    }
}

const app = express()

app.use('/dist', express.static(__dirname + '/client/dist'))
app.use('/static', express.static(__dirname + '/client/static'))

app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParserMiddleware())
app.use(passport.initialize())

const server = https.createServer(options, app)

app.get('/', myMiddleware((req, res) => {
    res.sendFile(__dirname + '/client/dist/index.html')
}))

app.all('*', (req, res) => {
    res.redirect('/')
})

server.listen(8080, function listening() {
    console.log('Listening on %d', server.address().port)
})

Без пути myMiddleware на '/' все работает как положено.Если myMiddleware присоединено как app.get('/', myMiddleware((req, res) => {, то myMiddleware вызывается несколько раз, а res.sendFile(__dirname + '/client/dist/index.html') не вызывается.


РЕДАКТИРОВАТЬ: приведенная ниже ошибка исправлена ​​в решении jfriend00.Промежуточное программное обеспечение, вызываемое несколько раз, все еще существует.Причиной является favicon, а некоторые другие активы не захватываются линией app.use('/static', express.static(__dirname + '/client/static')).Исправление пути решило и первую ошибку

Помимо этой проблемы, я попытался удалить часть ниже, но тогда приложение не работает вообще.Я предполагаю, что здесь есть 2 ошибки.

app.all('*', (req, res) => {
    res.redirect('/')
})

Я разместил изображение о том, как это выглядит при удалении app.all('*'..)

enter image description here

1 Ответ

0 голосов
/ 10 февраля 2019

Я собираюсь сделать предположение здесь.

Измените это:

app.get('/', myMiddleware((req, res) => {
    res.sendFile(__dirname + '/client/dist/index.html')
}));

на это:

app.get('/', myMiddleware(), (req, res) => {
    res.sendFile(__dirname + '/client/dist/index.html')
}));

Так что ваши res.sendFile() на самом делевызывается после myMiddleware вызовов next().


Затем удалите аргумент fn, чтобы у вас было это (не изменяет выполнение, но удаляет вводящий в заблуждение и неиспользуемый аргумент):

const myMiddleware = () => {
    return (req, res, next) => {
        var fullUrl = req.protocol + '://' + req.get('host') + req.url;
        console.log(fullUrl)
        next()
    }
}
...