【问题标题】:How to get json response instead of html response after curl request by using express?curl请求后如何使用express获取json响应而不是html响应?
【发布时间】: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


    【解决方案1】:

    像这样使用res.json({}) 而不是res.render

    res.json({ allmemes });
    

    注意:最好使用状态

    res.status(200).json({ allmemes });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多