Мой метод POST не работает, а моя функция GET работает. Что я делаю не так? - PullRequest
0 голосов
/ 19 июня 2020

Я создаю сокращение URL, используя Node.js, express и Monk. Но я продолжаю получать сообщение об ошибке при попытке выполнить POST.

Я пытаюсь отправить данные в свою базу данных mon go, но продолжаю получать ошибку 500. Что я здесь делаю не так? Когда я пытаюсь читать, значит, функция app.get('/:name') из index.js работает. Итак, я знаю, что соединение работает.

Это мой индекс. js

const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');

const urls = require('./db/urls');

const app = express();

app.use(morgan('tiny'));
app.use(bodyParser.json());
app.use(express.static('./public'))

app.get('/:name', async (req, res) => {
  const short = await urls.find(req.params.name);
  if (short) {
    res.redirect(short.url);
  } else { 
    //res.redirect(`/404.html?name=${req.params.name}`);
  }
});

app.post('/api/short', async (req, res) => {
  console.log(req.body);
  try {
    const url = await urls.create(req.body);
    res.json(url);
  } catch (error) {
    res.status(500);
    res.json(error);
  }
});

const port = process.env.PORT || 5000;
app.listen(port, () => {
    console.log(`Listening on port ${port}`);
})

Это моя база данных

const monk = require('monk');
const connectionURL = process.env.MONGODB_URI || 'localhost/url-shortener';

const db = monk(connectionURL);

module.exports = db;
const Joi = require('@hapi/joi')
const db = require('./connection');

const urls = db.get('urls');

const schema = Joi.object().keys({
  name: Joi.string().token().min(1).max(100).required(),
  url: Joi.string().uri({
    scheme: [
      /https?/
    ]
  }).required()
}).with('name', 'url');

function find(name) {
  return urls.findOne({
    name
  });
}

async function create(shortURLInfo) {
  const result = Joi.validate(shortURLInfo, schema);
  if (result.error === null) {
    const url = await urls.findOne({
      name: shortURLInfo.name
    });
    if (!url) {
      return urls.insert(shortURLInfo);
    } else {
      return Promise.reject({
        isJoi: true,
        details: [{
          message: 'Short name is in use.'
        }]
      });
    }
  } else {
    return Promise.reject(result.error);
  }
}

module.exports = {
  create,
  find
};

А это моя функция, которая вызывает базу данных

new Vue({
  el: '#app',
  data: {
    name: '',
    url: ''
  },
  methods: {
    createShortURL() {
      const body = {
        name: this.name,
        url: this.url
      };

      fetch('/api/short', {
        method: 'POST',
        body: JSON.stringify(body),
        headers: {
          'content-type': 'application/json'
        }
      }).then(response => {
        return response.json();
      }).then(result => {
        console.log(result);
      })
    }
  }
});
...