Начну с того, что я довольно новичок в программировании и бэкэнде.Я не был уверен, как отформатировать свой вопрос, и если есть дубликаты, пожалуйста, перешлите мне их.
Я создал экспресс-приложение, в котором я использую 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)
Как яКак было сказано ранее, объект корректно обновляется в моей базе данных, но я не могу продолжить, пока не решу эту ошибку.То, что мне так трудно отлаживать самостоятельно, это то, что объект корректно обновляется в моей базе данных, как в среде разработки, так и в тестовой среде.
Я пытался опубликовать как можно меньше кода, пожалуйста, дайте мнеЯ знаю, если нужно больше, или если вопрос неясен.Я включил тестовые файлы только для того, чтобы лучше объяснить мои журналы консоли, если они не нужны.