req.body和req.file都为空



这里是新手。我正在尝试做一个基本的降价博客。req.body没有我的markdown字段,并且在尝试上传文章时req.file是未定义的。我不知道问题是我如何配置主体解析器或multer,还是我的POST请求是如何发出的。

articles.js

const express = require("express");
const Article = require("./../../models/article")
const markdownConvert = require("./../../bin/markdown-converter")
const multer = require("multer");
const storage = multer.diskStorage( {
destination: "./assets/images",
filename: (req,file,cb) => {
cb(null,new Date()+"__"+file.originalname);
} 

})
const upload = multer({storage:storage}).single("blogImage");
const router = express.Router();
router.get("/new",(req,res)=> {
let article = new Article({
title: "",
markdown: []
});
res.render("new-post",{article:article,markdownConvert: markdownConvert});
})
router.get("/:id",async (req,res)=> {
const article = await Article.findById(req.params.id);
console.log(article);

res.render("article",{article : article, markdownConvert : markdownConvert})
})
router.post("/", async (req,res) => {
upload(req, res, (err) => {
if(err) {
console.log(err);
} else {
console.log(req.file);
res.send("test");
}
})
let article = new Article({
title: req.body.title,
date: new Date(),
markdown: markdownConvert.convertMarkdown(req.body.markdown), //Process text into JSON object
imgURL: `./assets/images/${req.filename}`
})

try {
article = await article.save();
res.redirect(`/articles/${article._id}`)
} catch (error) {
console.log(error);
console.log(article);
res.render("new-post", {article: article, markdownConvert: markdownConvert});
}
})
module.exports = router;

server.js

const express = require("express");
const app = express();
const port = 5000;
const mongoose = require("mongoose");
const articleRouter = require("./routers/articles/articles");
const bodyParser = require("body-parser");
const Article = require("./models/article");
mongoose.connect("mongodb://localhost/blog",{useNewUrlParser: true, useUnifiedTopology:true});
mongoose.connection.once("open", () => {
console.log("Connected to database");
}).on("error",(error)=> {
console.log(error);
})
app.set("view engine","ejs");
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use("/assets",express.static("assets"));
app.get("/", async (req,res) => {
const articles = await Article.find().sort( {date: "desc"});
console.log(articles[0].markdown);
res.render("index",{articles: articles});
})
app.listen(port);
console.log(`listening on ${port}`)
app.use("/articles",articleRouter);

形成

<div class="back">
<form action="/articles" method="POST" enctype="multipart/form-data">
<div>
<input required value = "<%= article.title %>" class="title input-title" name="title" id="title" type="text">
</div>
<div>
<textarea required value = "<%= markdownConvert.toStringMarkdown(article.markdown) %>" id="markdown" class="input-blog blog-content content" name="markdown" cols="30" rows="10"></textarea>
</div>
<input type="file" name="blogImage">
<div class="btn-container">
<button type="submit" class="submit-btn">Submit</button>
</div>
</form>
</div>

有人能指出我的错误吗?

重写如下。它可以解决问题

router.post("/", upload, async (req,res) => {
let article = new Article({
title: req.body.title,
date: new Date(),
markdown: markdownConvert.convertMarkdown(req.body.markdown), //Process text into JSON object
imgURL: `./assets/images/${req.filename}`
})
try {
article = await article.save();
res.redirect(`/articles/${article._id}`)
} catch (error) {
console.log(error);
console.log(article);
res.render("new-post", {article: article, markdownConvert: markdownConvert});
}
})

最新更新