Я получаю 500 "Внутренняя ошибка сервера" с findByIdAndUpdate, используя экспресс и mongoDB - PullRequest
0 голосов
/ 21 мая 2019

Начну с того, что я довольно новичок в программировании и бэкэнде.Я не был уверен, как отформатировать свой вопрос, и если есть дубликаты, пожалуйста, перешлите мне их.

Я создал экспресс-приложение, в котором я использую mongoDB и различные инструменты для создания API для будущего блога, которыйбудет реагировать приложение.До сих пор я работал довольно хорошо и уже начал работать с методами get, post и delete.Когда я начал создавать метод put, я столкнулся с проблемой.Я создал схему Мангуста, маршрутизатор для моего запроса пут и использую «findByIdAndUpdate» для обновления моей базы данных.Для тестирования я использую шутки и супертесты.

Проблема, с которой я столкнулся, заключается в том, что при попытке обновить объект в моей базе данных на основе его идентификатора я получаю 500 «Внутренняя ошибка сервера», даже если объект в моей базе данных успешно обновлен,Учитывая, что запрос проходит, несмотря на явную ошибку сервера, у меня нет ответов.

Что я пробовал:

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

  • Я создал тестовый файл, используя supertest и jest для проверки этой и всех моих предыдущих операций, которые работали просто отлично, за исключением этой.

  • Я использовал плагин VS Code REST Client для обновления своей базы данных.

  • Я пытался сделать свой супер-самый лучший прогноз (500), что заставило тест переместиться и пройтиподтверждая, что объект обновляется несмотря на ошибку сервера.

Модель моего блога, используя схему Mongoose

const mongoose = require('mongoose')

const blogSchema = mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  author: String,
  url: {
    type: String,
    required: true
  },
  likes: Number
})

blogSchema.set('toJSON', {
  transform: (document, returnedObject) => {
    returnedObject.id = returnedObject._id.toString()
    delete returnedObject._id
    delete returnedObject.__v
  }
})

module.exports = mongoose.model('Blog', blogSchema)

Мой маршрутизатор

const blogsRouter = require('express').Router()
const Blog = require('../models/blog')

blogsRouter.put('/:id', async (req, res, next) => {
  const body = req.body
  const blog = {
    title: body.title
  }
  try {
    const updatedBlog = await Blog.findByIdAndUpdate(req.params.id, blog, {
      new: true
    })
    console.log("Updated blog: ", updatedBlog)
    res.json(updatedBlog.toJSON())
  } catch (err) {
    next(err)
  }
})

module.exports = blogsRouter

Мой файл test_helper.js

const Blog = require('../models/blog')

const initialBlogs = [
  {
    title: 'testTitle',
    author: 'testAuthor',
    url: 'testUrl',
    likes: 3
  },
  {
    title: 'anotherTest',
    author: 'anotherAuthor',
    url: 'anotherUrl',
    likes: 25
  }
]

const nonExistingId = async () => {
  const blog = new Blog({ title: 'willremovethissoon' })
  await blog.save()
  await blog.remove()

  return blog._id.toString()
}

const blogsInDb = async () => {
  const blogs = await Blog.find({})
  return blogs.map(blog => blog.toJSON())
}

module.exports = {
  initialBlogs,
  nonExistingId,
  blogsInDb
}

Мой файл blogs_api.test.js

const mongoose = require('mongoose')
const supertest = require('supertest')
const helper = require('./test_helper')
const app = require('../app')
const api = supertest(app)

const Blog = require('../models/blog')

describe('when there is initially some blogs saved', () => {
  beforeEach(async () => {
    await Blog.remove({})

    for (let blog of helper.initialBlogs) {
      let blogObject = new Blog(blog)
      await blogObject.save()
    }
  })
describe('updating of blogs', () => {
test('a blog can be updated', async () => {
  const blog = {
    title:
      'updatedTitle - this gets through even thought Im getting 500 
       "internal server error"'
  }

  const blogsAtStart = await helper.blogsInDb()
  const blogToUpdate = blogsAtStart[0]
  console.log('Blog to update: ', blogToUpdate)

  await api
    .put(`/api/blogs/${blogToUpdate.id}`)
    .send(blog)
    .expect(200)

  const blogsAtEnd = await helper.blogsInDb()
  const blogAfterUpdate = blogsAtEnd[0]

  expect(blogAfterUpdate.title).toBe(blog.title)
})
})
})

Мой журнал при попытке обновить мой объект

jonas$ jest -t updated

FAIL  tests/blog_api.test.js
Console

console.log tests/blog_api.test.js:129
  Blog to update:  { title: 'testTitle',
    author: 'testAuthor',
    url: 'testUrl',
    likes: 3,
    id: '5ce30cbfd3ed531b538579ac' }
console.log controllers/blogs.js:62
  Updated blog: { _id: 5ce30cbfd3ed531b538579ac,
    title:
     'updatedTitle - this gets through even thought Im getting 500 "internal server error"',
    author: 'testAuthor',
    url: 'testUrl',
    likes: 3,
    __v: 0 }
console.log utils/logger.js:8
  updatedBlog.toJSON is not a function

when there is initially some blogs saved › updating of blogs › a 
blog can be updated

 expected 200 "OK", got 500 "Internal Server Error"

  at Test.Object.<anonymous>.Test._assertStatus (node_modules/supertest/lib/test.js:268:12)
  at Test.Object.<anonymous>.Test._assertFunction (node_modules/supertest/lib/test.js:283:11)
  at Test.Object.<anonymous>.Test.assert (node_modules/supertest/lib/test.js:173:18)
  at Server.localAssert (node_modules/supertest/lib/test.js:131:12)

Как яКак было сказано ранее, объект корректно обновляется в моей базе данных, но я не могу продолжить, пока не решу эту ошибку.То, что мне так трудно отлаживать самостоятельно, это то, что объект корректно обновляется в моей базе данных, как в среде разработки, так и в тестовой среде.

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

1 Ответ

1 голос
/ 21 мая 2019

Обратите внимание на эту строку в файле журнала:

updatedBlog.toJSON не является функцией

Таким образом, строка res.json(updatedBlog.toJSON()), вероятно, является нарушающей. Убедитесь, что вы пытаетесь вызвать метод toJSON() для правильного типа объекта и что вы еще не получаете JSON в качестве возвращаемого значения.

...