为什么我不能访问请求?Node.js中的body参数(express.js)



我在Javascript中访问另一个文件中的参数有问题。我有控制器添加内容和上传文件到服务器。

这里是代码,我调用上传函数,然后创建内容。

async post(req, res) {
try {
await upload(req, res)
.then(() => {
const uploadsFileNames = [];
const uploadsMimeTypes = [];
const uploadsPath = [];
let actualDate = new Date();
let formatedDate = moment(actualDate).format(
"DD.MM.YYYY, HH:mm:ss"
);

Content.create({
creationDate: formatedDate,
dateRange: req.body.dateRange,
sourceContent: req.body.sourceContent,
outputContent: req.body.outputContent,
selfGovernmentName: req.body.selfGovernmentName,
createdBy: req.body.createdBy
})
.then((result) => {
newContentId = result.id;
creationDate = formatedDate;
sourceContent = result.sourceContent;
outputContent = result.outputContent;
dateRange = result.dateRange,
selfGovernmentName = result.selfGovernmentName;
createdBy = result.createdBy;
})
.catch((err) => {
console.log(err);
res.status(500).send({
error: "Nepodarilo sa pridať obsah z dôvodu: ",
err,
});
})
.then(async () => {
const checkId = Content.findOne({ where: {id: newContentId }});
if (checkId == null) {
res.status(400).send({ message: 'Obsah so zadaným ID sa nenašiel.'});
return;
}
for(let i=0;i<req.files.length;i++){
uploadsFileNames.push(req.files[i].filename);
uploadsMimeTypes.push(req.files[i].mimetype);
uploadsPath.push(req.files[i].destination);
ContentAttachment.create({
fileName: uploadsFileNames[i],
mimeType: uploadsMimeTypes[i],
contentId: newContentId,
path: uploadsPath[i],
})
}
})
.catch((err) => {
console.log(err);
res.status(500)
})
.then(() => {
res.status(200).send({
message: "Obsah bol úspešne pridaný.",
});
})
})
.catch((callback) => {
res.status(400).send(callback); 
})

} catch (err) {
console.log(err);
res.status(500);
}
},

这是整个upload.js文件。

const util = require("util");
const path = require("path");
const multer = require("multer");
const moment = require("moment");
const slugify = require("slugify");
const process = require("process");
const fs = require("fs");
const formatedDate = moment(Date.now()).format(
"DD-MM-YYYY_HH-mm-ss"
);
const maxSize = 500000;
var storage = multer.diskStorage({
destination: (req, file, callback) => {
const selfGovernment = 'Bratislava';
const week = 'druhy az treti';
var dir1 = path.join(`${__dirname}/../../uploads/${selfGovernment}`);
var dir2 = path.join(`${__dirname}/../../uploads/${selfGovernment}/${week}`);
if (!fs.existsSync(dir1)){
fs.mkdirSync(dir1, { recursive: true });
}
if (!fs.existsSync(dir2)){
fs.mkdirSync(dir2, { recursive: true });
}
if (fs.existsSync(dir1)) {
if (fs.existsSync(dir2)){
callback(null, path.join(`${__dirname}/../../uploads/${selfGovernment}/${week}`));
}
} else {
console.log('Directory not found.');
}
},
filename: (req, file, callback) => {
const fileSize = parseInt(req.headers["content-length"]);
const match = ["image/png", "image/jpeg", "image/jpg", "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"];
if (match.indexOf(file.mimetype) === -1) {
console.log(file)
var message = `${file.originalname} je chybný súbor. Odosielajte iba png/jpeg/jpg alebo pdf/doc.`;
return callback(message, null);
}
else if(fileSize > maxSize){
console.log(file)
var tooLargeMessage = `${file.originalname} je chybný súbor. Odosielajte súbory do 5MB.`;
return callback(tooLargeMessage, null);
}  
//var filename = crypto.randomUUID();
var newName = slugify(file.originalname);
var filename = `${formatedDate}_${newName}`;
callback(null, filename);
}
});
var uploadFiles = multer({ storage: storage, limits: { fileSize: maxSize } }).array("multi-files", 4);
var uploadFilesMiddleware = util.promisify(uploadFiles);
module.exports = uploadFilesMiddleware;

问题是我想从第一个组件发送selfGovernmentName和week从request .body。并使用它在上传中创建同名的新文件夹

我怎么才能做到呢?我什么都试过了,我在网上搜索,但什么也没找到。对我来说奇怪的是,当我控制台日志请求。body作为try block中的第一项,得到空对象。但是当我像这样运行代码时,它会工作并上传文件并在数据库中创建内容,但我不想在那里硬编码name和week。

感谢编辑+整个upload.js文件和post函数:

我正在从routes.js调用post .

const ContentAttachmentController = require("../controllers/ContentAttachmentController");
app.post("/api/v1/content/attachments",
ContentAttachmentController.post
);

server.js

require("dotenv").config();
const express = require("express");
const config = require("./src/config/config");
const { sequelize } = require('./src/models');
const cookieParser = require("cookie-parser");
const bodyParser = require("body-parser");
const cors = require('cors');
const app = express();
app.use(cors({
origin: 'http://localhost:8080',
credentials: true,
exposedHeaders: ['set-cookie']
}));
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
// parse application/json
app.use(bodyParser.json());
app.use(cookieParser());
require("./src/routes/routes")(app);
sequelize.sync().then(() => {
app.listen(config.app_port, () => {
console.log(`Server is up and running at port: ${config.app_port}`);
});
});

当我从邮递员发送请求时,它会上传文件,在数据库中创建内容,并通过ID将上传的文件传递给该内容。

当我为文件夹提供硬编码的名称和日期时,一切都为我工作。我需要从控制器文件给这两个参数Upload.js中间件。

点播。如果我能够创建内容,body就不能为空。

我正在使用multer上传文件到服务器。

我解决了这个问题。这很有趣,但问题是,因为在邮差我发送的第一个文件,然后内容。我改变了顺序,先发送内容然后发送文件现在可以运行了