javascript - 错误:文件验证失败:内容:需要路径“内容”。标题:需要路径“标题”
问题描述
我正在尝试在数据库中添加文本数据并将其显示在仪表板上。我为添加文件创建了一条单独的路线。我正在关注 Brad 的视频:NodejsfromScratch 我目前停留在添加文件部分 (1:31:24)
当我在添加文件表单中输入文本数据时,出现此错误:
Error: File validation failed: content: Path `content` is required., title: Path `title` is required.
at ValidationError.inspect (E:\EXP_NP\BT\node_modules\mongoose\lib\error\validation.js:47:26)
at internal/per_context/primordials.js:23:32
at formatValue (internal/util/inspect.js:783:19)
at inspect (internal/util/inspect.js:337:10)
at formatWithOptionsInternal (internal/util/inspect.js:2016:40)
at formatWithOptions (internal/util/inspect.js:1898:10)
at console.value (internal/console/constructor.js:330:14)
at console.warn (internal/console/constructor.js:363:61)
at E:\EXP_NP\BT\routes\files.js:24:16
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
errors: {
content: ValidatorError: Path `content` is required.
at validate (E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1253:13)
at E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1236:7
at Array.forEach (<anonymous>)
at SchemaString.SchemaType.doValidate (E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1181:14)
at E:\EXP_NP\BT\node_modules\mongoose\lib\document.js:2517:18
at processTicksAndRejections (internal/process/task_queues.js:75:11) {
properties: [Object],
kind: 'required',
path: 'content',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
},
title: ValidatorError: Path `title` is required.
at validate (E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1253:13)
at E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1236:7
at Array.forEach (<anonymous>)
at SchemaString.SchemaType.doValidate (E:\EXP_NP\BT\node_modules\mongoose\lib\schematype.js:1181:14)
at E:\EXP_NP\BT\node_modules\mongoose\lib\document.js:2517:18
at processTicksAndRejections (internal/process/task_queues.js:75:11) {
properties: [Object],
kind: 'required',
path: 'title',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true
}
},
_message: 'File validation failed'
}
我的文件架构:(模型/文件)
const mongoose = require('mongoose');
const fileSchema = new mongoose.Schema({
title: {
type: String,
required:true,
trim: true
},
content: {
type: String,
required:true
},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
createdAt: {
type: Date,
default: Date.now
}
})
module.exports = mongoose.model('File', fileSchema);
我的文件路线:(路线/文件)
const express = require('express')
const router = express.Router()
const { ensureAuth } = require('../middleware/auth')
const File = require('../models/Files')
// @desc Show add page
// @route GET /files/add
router.get('/add', ensureAuth, (req, res) => {
res.render('files/add', {
layout: 'add',
title: 'Add',
})
})
// @desc Process add form
// @route POST /files
router.post('/', ensureAuth, async (req, res) => {
try {
req.body.user = req.user.id
await File.create(req.body)
res.redirect('/dashboard')
} catch (err) {
console.error(err);
res.render('error/500')
}
})
module.exports = router
我的 app.js
const express = require('express')
const dotenv = require('dotenv')
const morgan = require('morgan')
const path = require("path")
const exphbs = require("express-handlebars")
const passport = require('passport')
const session = require('express-session');
const MongoStore = require('connect-mongo');
// DATABASE CONNECTION
const connectDB = require('./config/db')
const { connection } = require('mongoose')
// Load config
dotenv.config({ path: './config/config.env' })
//Passport config
require('./config/passport')(passport)
connectDB()
const app = express()
// Body Parser
app.use(express.urlencoded({extended: false}))
app.use(express.json())
// Handlebars
app.engine('.hbs', exphbs({
defaultLayout: 'main',
extname: '.hbs',
partialsDir: __dirname + '/views/partials/',
layoutsDir: __dirname + '/views/layouts'
}))
app.set("view engine", "hbs");
app.use(express.static(__dirname + '/public'));
// Express Session Middleware
app.use(session({
secret: process.env.SECRET_KEY,
resave: false,
saveUninitialized: false,
store: MongoStore.create({ mongoUrl: process.env.MONGO_URI, collection: 'sessions' }),
cookie: {
maxAge: 1000 * 60 * 60 * 24 // 1 Day
}
}))
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
// Routes
app.use('/',require('./routes/index'))
app.use('/users',require('./routes/users'))
app.use('/files',require('./routes/files'))
app.set("view engine", "hbs");
// app.set("views", template_path);
if(process.env.NODE_ENV === 'development') {
app.use(morgan('dev'))
}
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`Server running in ${process.env.NODE_ENV} mode on PORT ${PORT}`);
});
我的 html 文件:*(views/files/add)
<form action="/files" method="POST">
<div class="form">
<p>
<label>Title <span>*</span> </label>
<input type="text" class="field size" />
</p>
<p>
<label>Content <span>*</span> </label>
<textarea name="body" id="body" class="field size" rows="10" cols="30"></textarea>
</p>
<input type="submit" value="Save" class="btn btn-outline-dark btn-lg">
</div>
</form>
我的布局文件:*(视图/布局/添加)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Add Files</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"
integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA=="
crossorigin="anonymous" />
<link rel="stylesheet" href="/css/add.css" />
<title>{{ title }}</title>
</head>
<body>
{{{body}}}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.16.0/ckeditor.js" integrity="sha512-7My1gsUz5JUQgT8+P0sHKaPel/77X3zjGZsXbTS8Y7MhDEJ+f9xg9H+pPzONFL5djye0zWLlxFLApGsWQ1gdfA==" crossorigin="anonymous"></script>
<script>
CKEDITOR.replace('body', {
plugins: 'wysiwygarea, toolbar, basicstyles, link'
})
</script>
</body>
</html>
我的输入:
标题: Lorem Ipsum 内容: Lorem Ipsum 只是印刷和排版行业的虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是行业的标准虚拟文本,当时一位不知名的印刷商采用了一种类型的厨房并将其加扰以制作一本类型样本书。它不仅经历了五个世纪,而且经历了电子排版的飞跃,基本保持不变。它在 1960 年代随着包含 Lorem Ipsum 段落的 Letraset 表的发布而流行起来,最近还随着 Aldus PageMaker 等桌面出版软件(包括 Lorem Ipsum 的版本)而普及。
解决方案
您的标题输入没有名称,您的 textarea 被命名为 body。添加name="title"
到输入并将文本区域名称更改为content
<form action="/files" method="POST">
<div class="form">
<p>
<label>Title <span>*</span> </label>
<input name="title" type="text" class="field size" />
</p>
<p>
<label>Content <span>*</span> </label>
<textarea name="content" id="body" class="field size" rows="10" cols="30"></textarea>
</p>
<input type="submit" value="Save" class="btn btn-outline-dark btn-lg">
</div>
</form>
推荐阅读
- javascript - 在 JavaScript 中将日期时间字符串转换为 UTC 日期
- webview2 - 具有 WebView2 运行时依赖项的 C# 安装程序
- angular - 在 appflow 中构建 app 离子电容器时出错
- amazon-web-services - AWS 云中的视频编辑和存储
- kubernetes - 在ansible上创建一个隐藏目录
- ios - 使用 SwiftUI 3 .badge 修饰符时更新 TabView 徽章会重新加载所有视图
- javascript - 如何检索选定的复选框项目并将它们显示在窗口中?
- c++ - 在这种情况下 dynamic_cast 的替代方案?
- ios - SwiftUI在使用菜单时禁用递归触发器日志记录
- c# - 如何将 Vector3 列表存储在字符串 Unity c#