#javascript #mongodb #express #http #mongoose
Вопрос:
Мое предложение состоит в том, чтобы:
Если пользователь попытается создать новую запись в телефонной книге для человека, имя которого уже есть в телефонной книге, интерфейс попытается обновить номер телефона существующей записи, отправив запрос HTTP PUT на уникальный URL-адрес записи.
Измените серверную часть для поддержки этого запроса.
Убедитесь, что интерфейс работает после внесения изменений.
Я не могу понять, как это сделать. У меня был ответ, в котором говорилось, что я должен просто использовать один метод app.put, но я не знаю, как на самом деле реализовать это и заставить его работать. Я получаю несколько ошибок при попытке обновления, в том числе «Выполнение обновления пути» _id » приведет к изменению неизменяемого поля. Я не знаю, нужно ли реализовывать простую ситуацию «создать или обновить» с помощью express и мангуста. Не мог бы кто-нибудь, пожалуйста, показать это в коде javascript?
Спасибо.
require('dotenv').config() const morgan = require('morgan') const express = require("express") const cors = require("cors") const app = express() const Person = require('./models/phonenumbers') app.use(express.json()) app.use(cors()) app.use(express.static('build')) morgan.token('body', (req, res) =gt; JSON.stringify(req.body)); app.use( morgan(function (tokens, req, res) { if(req.method === "POST"){ return [ tokens.method(req, res), tokens.url(req, res), tokens.status(req, res), tokens.res(req, res, 'content-length'), '-', tokens['response-time'](req, res), 'ms', tokens.body(req,res) ].join(' ') } else { return } })) app.get('/api/persons',(req,res) =gt; { Person.find({}).then(persons =gt; res.json(persons)) }) app.get('/info',(req,res) =gt; { const d = new Date() const leng = Person.find({}).then(persons =gt; { persons.length }) Person.count({},function(err,count){ res.send( ` lt;pgt; Phonebook has info for ${count} people lt;/pgt; lt;pgt; ${d} lt;/pgt; `) }) }) app.get('/api/persons/:id', (request, response, next) =gt; { Person.findById(request.params.id) .then(person =gt; { if(person) { response.json(person) } else { response.status(404).end() } }) //Next function invoked for error that continues //to the error handler middleware .catch(error =gt; next(error)) }) app.put('/api/persons/:id',(req,res,next) =gt; { const body = req.body const phone = { name: body.name, number:body.number } Person.findByIdAndUpdate(req.params.id, phone, { new: true }) .then(updatedPerson =gt; { res.json(updatedPerson) }) .catch(error =gt; next(error)) }) app.post('/api/persons',(req,res) =gt; { const body = req.body const containsNameNumber = body.name amp;amp; body.number if(!containsNameNumber){ return res.status(400).json({ error:"must specify a name and a number" }) } const phone = new Person({ name: body.name, number:body.number }) phone.save().then(savedPerson =gt; { res.json(savedPerson) }) }) const errorHandler = (error, request, response, next) =gt; { console.log(error.message) if(error.name === 'CastError'){ return response.status(400).send({error:'malformatted id'}) } next(error) } app.use(errorHandler) app.delete('/api/persons/:id',(req,res) =gt; { Person.findByIdAndRemove(req.params.id) .then(result =gt; { res.status(204).end() }) .catch(error =gt; next(error)) }) //const PORT = process.env.PORT || 3001 const PORT = 3002 app.listen(PORT, () =gt; { console.log(`Server running on port ${PORT}`) })