Node.js 带有路由的NodeJS不会发布并返回404异常

Node.js 带有路由的NodeJS不会发布并返回404异常,node.js,express,post,routes,Node.js,Express,Post,Routes,我正在写一篇简单的博客文章,但当我按submit时,它只会打印我在控制台表单上输入的内容的数组。在按下提交键后,我的登录页上返回了404 这是我的表格ejs: 电子邮件 博客内容 注册 这是我的app.js文件(从该文件返回404错误处理程序) const mongoose=require('mongoose'); require('dotenv').config() const pages=require(“./pages”); const express=require('expre

我正在写一篇简单的博客文章,但当我按submit时,它只会打印我在控制台表单上输入的内容的数组。在按下提交键后,我的登录页上返回了404

这是我的表格
ejs


电子邮件
博客内容
注册



这是我的
app.js
文件(从该文件返回404错误处理程序)

const mongoose=require('mongoose');
require('dotenv').config()
const pages=require(“./pages”);
const express=require('express');
const path=require('path');
const flash=require('connect-flash')
const session=require('express-session')
const regroutr=需要('./路由/重新路由');
const logroutr=require(“./routes/logRoutes”);
const blgroutr=require(“./routes/internalroutes”)
const passport=require(‘passport’);
常量app=express();
要求('./配置/护照')(护照);
connect(process.env.DB_CONNECTION,{useUnifiedTopology:true,useNewUrlParser:true});
const db=mongoose.connection;
db.on('error',console.error.bind(console,'connectionerror:');
db.once('open',function(){
log('DB Connected!!!');
});
应用程序集(“查看引擎”、“ejs”);
app.use(express.urlencoded({extended:false}))
应用程序使用(会话)({
秘密:“秘密”,
雷萨夫:是的,
saveUninitialized:true,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/',require('./routes/index.js');
app.get('/newblog',函数(请求,响应){//这是我发送博客表单的地方
response.render('blog')
})
app.use('/suces',blgroutr)//这是提交按钮将指示我的位置,但我得到404
应用程序使用('/registered',regroutr);
应用程序使用('/profile',logroutr);
app.use(express.static(path.join(uu dirname,'public'));
应用程序使用(功能(错误、响应){
控制台错误(错误正文)
response.status(404.render('notfound',page.notfound));
})
const PORT=process.env.PORT | 3000;
app.listen(端口,函数(){
log(`listing on PORT${PORT}`)
})


我的博客帖子路径(
internalroute.js
)这不会检测到我的表单,或者我的表单不会检测到文件

const express=require('express');
const pgroutr=express.Router();
const blgschema=require('../models/blogschema');
pgroutr.post('/newblog',函数(req,res){
const usr=req.body.userna;
const blgtt=请求正文标题;
const dtToday=req.body.date;
const blgcont=req.body.blogcont;
const newbPost=新blgschema(
{
用户名:usr,
标题:blgtt,
日期:今日,
博客内容:blgcont
}
);
保存(函数(err,newbPost){
if(err)返回res.render('error',pages.error);
console.log('文档已添加到集合')
res.render(“成功”)
})
});
module.exports=pgroutr;

您的HTML表单似乎正在提交到由
formaction
属性在提交按钮中指定的URL:

<input type="submit" value="Submit Blog" id="sub" formaction="sucess">
因此,这会将其发送到
blgroutr
,您似乎正在从中加载:

const blgroutr = require('./routes/internalroutes')
然后,如果我们查看internalroutes.js文件,则只有一条路由,即:

 pgroutr.post('/newblog', function(req, res){...}
要使其工作,您必须将HTML更改为:

<input type="submit" value="Submit Blog" id="sub" formaction="/sucess/newblog">
<input type="submit" value="Submit Blog" id="sub" formaction="/sucess">

分配给路由器的路径将添加到路由器路由定义中指定的路径


但是,正如我在评论中所说的,仅仅为一条路由使用路由器是没有任何意义的。您可以只导出一个路由处理程序。如果你问我,最干净的设计是:

<input type="submit" value="Submit Blog" id="sub" formaction="/createBlog">

const blgroutr = require('./routes/internalroutes')

app.post('/createBlog', blgroutr.createBlog);

const blgroutr=require(“./routes/internalroutes”)
app.post('/createBlog',blgroutr.createBlog);
然后,在
blgroutr
的代码中,只需导出一个带有单独路由处理程序的对象



另外,我发现你的代码非常难读,因为你从变量名中随机删除了一些字母,否则这些字母将是真实的单词,例如
success
pgroutr
blgroutr
。这使得在键入应该引用它们的代码时,在精神上很难记住确切的拼写。我更愿意看到
成功
pgrouter
blgrouter
。注意,我还建议将操作URL从
success
更改为
/createBlog
,因为在REST传统中,您希望URL具有有意义的描述性。

我提出了一个解决方案,删除了internalroutes文件,并从中复制了代码,并将其直接粘贴到app.js中,这是其中的一部分:

const blgschema = require('../models/blogschema');


pgroutr.post('/sucess', function(req, res){

  const usr = req.body.userna;
  const blgtt = req.body.title;
  const dtToday = req.body.date;
  const blgcont = req.body.blogcont;
  const newbPost = new blgschema(
    {
      username: usr,
      title: blgtt,
      date: dtToday,
      blog_cont: blgcont
    }
  );
  newbPost.save(function (err, newbPost){
    if (err) return res.render('error', pages.error);
    console.log('document added to collection')
    res.render('sucess')
  })
});
并将我的EJS/HTML更改为:

<input type="submit" value="Submit Blog" id="sub" formaction="/sucess/newblog">
<input type="submit" value="Submit Blog" id="sub" formaction="/sucess">


您的表单帖子似乎没有
action
属性来告诉浏览器要发布到哪个URL。在您的情况下,它看起来应该是
。或者,如果您正在使用提交按钮上的
formaction
属性,那么它需要是正确的URL才能点击您的路线。@jfriend00-如果我点击提交,它不应该是
作为我的提货页面吗?因为/newblog是我访问表单的地方是的,我不确定你想让它走哪条路线。注意,按钮中有一个
formaction
属性,它覆盖了
标记中的action属性。请仅使用其中一个,并将其指向
/suces
。然后,在该
blgroutr
中,您需要一个未显示的
/
处理程序。奇怪的是,您将外部路由器用于单路由处理程序。这并不是使用路由器的正确方式。如果只有一个路由要处理,只需导出一个路由处理程序。没有理由只为一条路由创建路由器。@jfriend00所以就把它放在app.js文件中吧?因为我的网站部分也使用其他路由,所以我希望它是外部的,这样我就可以轻松地配置它。谢谢,我还没有修复它,但我会尝试你建议的