簡體   English   中英

類型錯誤:無法讀取 Express 上未定義的屬性“get”

[英]TypeError: Cannot read property 'get' of undefined on Express

我正在使用 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)

如果我正在調用 send 方法,我不明白為什么會涉及 get 方法。

這個調用是:

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.'))
}

我想要的是創建函數的單元測試。

我發現的第一個問題是如何模擬請求和響應。 正如我對請求所做的一切一樣,我使用的是 json 屬性body並且沒有更多問題。

當前的問題是響應。

無論你試圖用這個做什么:

const res = require('express').response

看起來被誤導了。 Express 對象上的.response屬性不是實時響應對象。 如果您查看Express 代碼相應部分,您可以看到require('express').response是響應模塊(以及它導出的所有內容)。 這些方法將用於實時響應對象,但尚未用於實時響應對象。 這些只是最終將附加到實時響應對象的導出方法。 在將它們附加到實時響應對象之前,您不能以這種方式使用它們。

如果您進一步./response.js Express 項目中的./response.js ,您會發現require('express').response實際上是派生自http.ServerResponse.prototype的原型,Express 稍后在創建實時響應對象時將使用該原型。

當您在res這個原型版本上實際調用res.send()時,它可能實際調用的第一個方法似乎在這部分代碼中

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

由於嘗試以這種方式使用原型時this是不正確的,因此不會有.get()方法並且您會看到您看到的錯誤。


因此,當您嘗試以使用實時響應對象的方式使用該res對象時,您將收到某種錯誤。 我們必須能夠調試您的確切代碼,以解釋為什么它會以這種方式抱怨(也許涉及到 getter,因此錯誤消息引用get - 這只是一個猜測)。 但是,很明顯res沒有被正確使用。

如果您展示更多代碼的上下文(包括整個請求處理程序),我們可以就如何編寫代碼提出更多建議。 如果您想了解更多關於錯誤出現的原因的詳細信息,我們需要能夠實際運行您的代碼的那部分來調試它並查看究竟發生了什么。 在任何情況下,您都需要更改從哪里獲取res


要測試使用 http 響應對象的create()函數,您可以創建一個真正的 http 響應對象(涉及一個真正的 http 請求/響應)或創建一個模擬 http 響應對象並掛鈎適當的方法以查看該函數是否它應該是什么。 您可以在此處閱讀有關模擬 http 響應對象的各種想法的任意數量的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM