Я создаю сокращение 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);
})
}
}
});