req.body 和 req.file 都是空的

req.body and req.file are both empty

这里是新手。我正在尝试制作一个基本的降价博客。 req.body 没有我的降价字段,并且 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});
}
})