Ошибка типа: невозможно прочитать свойство 'get' из неопределенного в Express - PullRequest
0 голосов
/ 05 февраля 2020

Я разрабатываю приложение с express, но получаю эту ошибку:

 TypeError: Cannot read property 'get' of undefined

      45 |
      46 |   if (!validate.pass)
    > 47 |      return res.status(400).send(
         |                             ^
      48 |              response(false, validate.errors, 'Error in request.')
      49 |      )
      50 |

      at ServerResponse.json (node_modules/express/lib/response.js:257:20)
      at ServerResponse.send (node_modules/express/lib/response.js:158:21)
      at Object.create (controllers/rideController.js:47:27)
      at Object.<anonymous> (__test__/rideController.test.js:32:10)

Я не понимаю, почему используется метод get, если я вызываю метод send.

Вызов этого:

const res = require('express').response
...
ride.create({body: data}, res)

Функции:

const rideRules = {
  rider: 'required|user',
  passenger: 'required|array',
  seats: 'required|integer',
  start_location: 'required|string',
  destination: 'required|string'
}

const errorsMessage = {
  'required.rider': "El conductor es necesario.",
  'required.passenger': "Los pasajeros son necesarios.",
  'required.seats': "El número de asientos disponibles es necesario.",
  'start_location': "El lugar de partida es necesario.",
  'destination': "El lugar de destino es necesario."
}

const create = (dataRide) => {
  const { rider, passenger, seats, start_location, destination } = dataRide
  return rides.create({
    rider: rider,
    passenger: passenger,
    available_seats: seats,
    status: 'En progreso',
    start_location: start_location,
    destination: destination,
    time: new Date(),
    ride_finished: false,
    comment: [{}]
  })
}

exports.create = (req, res) => {
  const validate = validateIn(req.body, rideRules, errorsMessage)

  if (!validate.pass) 
    return res.status(400).send(
        response(false, validate.errors, 'Error in request.')
    )

  const rideInf = create(req.body)

  return res.status(200).send(response(true, rideInf, 'Ride created.'))
}

Мне нужен модульный тест функции создания.

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

Текущая проблема - это ответ.

1 Ответ

0 голосов
/ 05 февраля 2020

Что бы вы ни пытались сделать с этим:

const res = require('express').response

выглядит ошибочно. Свойство .response объекта Express не является объектом прямого ответа. Если вы посмотрите на соответствующую часть Express кода , вы увидите, что require('express').response - это модуль ответа (и все, что он экспортирует). Это методы, которые будут использоваться для объекта живого ответа, но еще не для объекта живого ответа. Это просто экспортированные методы, которые в конечном итоге будут присоединены к объекту живого ответа. Вы не можете использовать их таким образом, пока они не будут присоединены к действующему объекту ответа.

Если вы посмотрите дальше на ./response.js в Express проекте , вы увидите, что require('express').response на самом деле является прототипом, полученным из http.ServerResponse.prototype, который Express будет использовать позже при создании объекта живого ответа.

Когда вы на самом деле вызываете res.send() в этой версии прототипа res, он появляется что первый метод, который он может вызвать на самом деле, находится в этом разделе кода :

  if (!this.get('Content-Type')) {

Поскольку this неверно при попытке использовать прототип таким образом, не будет .get(), и вы получите ошибку, которую видите.


Таким образом, когда вы попытаетесь использовать этот объект res так же, как вы используете объект живого ответа, вы получите какая-то ошибка. Мы должны были бы иметь возможность отладить ваш точный код, чтобы объяснить, почему он жалуется именно так, как он это делает (возможно, задействован геттер и, следовательно, сообщение об ошибке ссылается на get - это только предположение). Но совершенно очевидно, что res используется неправильно.

Если вы покажете больше контекста вашего кода (включая весь обработчик запросов), мы можем сделать больше предположений о том, как это следует делать быть написано. Если вы хотите получить более подробную информацию о том, почему ошибка возникает именно так, как надо, нам нужно иметь возможность запустить эту часть кода, чтобы отладить ее и посмотреть, что именно происходит. В любом случае вам нужно изменить, откуда вы получите res.


Чтобы протестировать вашу create() функцию, которая использует объект ответа http, вы можете либо создать реальный объект ответа http (включая реальный запрос / ответ http) или создайте фиктивный объект ответа http и подключите соответствующие методы, чтобы увидеть, выполняет ли функция то, что должна. Вы можете прочитать любое количество статей здесь о различных идеях насмешки над объектом ответа http.

...