Тайм-аут запроса Nodejs при выполнении запроса http при разрешении запроса на моем сервере - PullRequest
0 голосов
/ 23 ноября 2018

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

//basicAuth.js
import axios from 'axios'
export default async function(ctx,next) {
console.log(ctx.headers)
let result = await axios({
    url: process.env.USER_SERVICE_LOGIN_PATH,
    baseURL: process.env.USER_SERVICE_BASE_URL,
    method: 'HEAD',
    headers: ctx.headers,
    timeout: 5000
})
await next()
}

Это используется моим сервером в качестве промежуточного программного обеспечения:

app.use(basicAuth)

Другая служба проверяет заголовки и отвечает 200 или 401.

Это прекрасно работает, когда я получаю запрос GET на мой сервер.Но когда я получаю запрос POST, другой сервер, к которому я обращаюсь при вызове axios, выдает ошибку ERCONNRESET, и время соединения истекает.Посмотрите на мой код для этого маршрута и некоторые другие:

router.get('/', async ctx => {

ctx.set('Allow','GET, POST')
try {
    if (ctx.get('error')) throw new Error(ctx.get('error'))

    let res = await db.getCourses({...ctx.query})
    ctx.status = status.OK
    ctx.body = res
}
catch(err) {
    ctx.status = status.BAD_REQUEST
    ctx.body = {status: status.BAD_REQUEST, message: err.message}
}
})
router.post('/create', async ctx => {
ctx.set('Allow','POST')
try {
    if (ctx.get('error')) throw new Error(ctx.get('error'))

    let res = await db.postCourse({data: ctx.request.body})
    ctx.status = status.OK
    ctx.body = res
}
catch(err) {
    ctx.status = status.BAD_REQUEST
    ctx.body = {status: status.BAD_REQUEST, message: err.message}
}
})

Это очень странное поведение, и я могу только догадываться, почему это происходит, потому что есть какой-то заголовок или что-то, что нарушает запрос.Я зарегистрировал заголовки, переданные в вызове axios, в результате запроса POST /create.

{ 'content-type': 'application/json',
  'cache-control': 'no-cache',
  'postman-token': '561fca27-f23a-4ae8-ba05-5fbeef0f0d20',
  'user-agent': 'PostmanRuntime/7.4.0',
  accept: '*/*',
  host: 'localhost:3031',
  'accept-encoding': 'gzip, deflate',
  'content-length': '122',
  connection: 'keep-alive' }

Любая идея, почему мой вызов axios не проходит, когда я получаю доступ к POST / create.Единственный вывод, который я получаю с другого сервера, это ERRCONRESET, маршрут, к которому я пытаюсь получить доступ, даже не достигнут, я тестировал с console.logs.

...