【发布时间】:2021-05-10 11:10:21
【问题描述】:
我正在使用 express、mongoose、MongoDB 制作一个具有基本 CRUD 功能的简单应用程序,其中用户只需使用 Owner、Caption、ImageURL 提交表单,当我在本地机器上运行它时,它完全可以正常工作,但问题是是当我执行 curl 请求时,我得到 HTML 格式的响应,而不是我希望它以 JSON 格式存储在数据库中的数据作为响应 下面是使用 express 的 app.js 文件
const express = require('express')
const mongoose = require('mongoose')
const app = express();
const path = require('path')
const ejsMate = require('ejs-mate')
const Joi = require('joi')
const data = require('./models/schema')
//method override is being used because if in case of PUT or PATCH request we
// require method over ride since by form we can only do POST request
const methodoverride = require('method-override');
const catchAsync = require('./utils/catchasync');
const ExpressError = require('./utils/ExpressErrors');
mongoose.connect('mongodb://localhost:27017/datakeeper', {
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true
})
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", () => {
console.log("Database connected")
});
app.engine('ejs', ejsMate)
app.set('view engine', 'ejs')
app.set('views', path.join(__dirname, 'views'))
app.use(methodoverride('_method'));
app.use(express.urlencoded({ extended: true }))
app.get('/', async (req, res) => {
res.render('new')
})
const validatedata = (req, res, next) => {
const { error } = data.validate(req.body);
if (error) {
const msg = error.details.map(el => el.message).join(',')
throw new ExpressError(msg, 404)
}
else {
next();
}
}
app.post('/page', validatedata, catchAsync(async (req, res, next) => {
const newmemes = new data(req.body.datas);
await newmemes.save()
res.redirect('/page/all')
}))
app.get('/page/all', catchAsync(async (req, res) => {
const allmemes = await data.find({});
allmemes.reverse()
res.render('allmemeslist', { allmemes });
}))
app.get('/page', catchAsync(async (req, res) => {
const allmemes = await meme.find({});
allmemes.reverse()
if (allmemes.length > 100)
allmemes.splice(0, 100);
//res.send(allmemes.json({}))
res.render('allmemeslist', { allmemes });
}))
app.get('/page/:id', catchAsync(async (req, res) => {
const partmeme = await meme.findById(req.params.id)
res.render('show', { partmeme });
}))
app.get('/page/:id/edit', catchAsync(async (req, res) => {
const partmeme = await meme.findById(req.params.id)
res.render('edit', { partmeme })
}))
app.put('/page/:id', validatedata, catchAsync(async (req, res, next) => {
const { id } = req.params
const upmeme = await meme.findByIdAndUpdate(id, { ...req.body.memes }, { new: true })
res.redirect(`/memes/${id}`)
}))
app.delete('/page/:id', catchAsync(async (req, res) => {
const { id } = req.params;
const campground = await data.findByIdAndDelete(id);
res.redirect('/page/all');
}))
app.all('*', (req, res, next) => {
next(new ExpressError('Page Not found', 404))
})
app.use((err, req, res, next) => {
const { statusCode = 404 } = err;
//console.log(statusCode)
if (!err.message)
err.message = 'Oh! No Something went wrong!! Error has Come'
return res.status(statusCode).render('error', { err })
})
app.listen(8081, () => {
console.log('Serving on port 8081')
})
在浏览器上运行时,我能够获得正确的输出,但在 curl 请求(通过 GIT BASH 发出)中使用 get
curl --location --request GET 'http://localhost:8081/page'
我想要 JSON 格式的输出,但它返回的是我在上面呈现的整个 HTML 代码有没有办法以 JSON 格式而不是 HTML 格式获取数据
【问题讨论】:
标签: json mongodb express curl mongoose