我有一个工作正常的小型Express应用程序,我用它来创建注册操作,但我觉得它变得越来越混乱,所以我分离了POST请求路由处理程序,并将其放入另一个文件中,我感觉我正确地导入了所有内容,但我一直收到错误:

Cannot POST /register

以下是我的server.js文件:


  //Creating the express app and hosting it locally
const express=require('express');
const app=express();
const bcrypt=require('bcrypt');
const mysql=require('mysql2');
const flash=require('express-flash');
const session=require('express-session');
const util = require('util'); // Import the util module
const regroute=require('./Register');
  
  // Load environment variables from .env file
  require('dotenv').config();
  const port= process.env.PORT ;
  const host= process.env.DB_HOST;
  const user= process.env.DB_USER;
  const db_name=process.env.DB_NAME;
  const pass=process.env.DB_PASSWORD;
  const sec=process.env.SECRET_SESSION;
  
  
  app.listen(port);
  
  
  ////Creating a database connection object
  const connection = mysql.createConnection({
      host: host,
      user: user,
      password: pass,
      database: db_name
  });
  connection.connect();
  
  // Setting up the view engine (ejs)
app.set('view engine', 'ejs');
  //setting up middlewares
app.use(session({
    secret: sec, // Replace with a strong secret key
    resave: false,
    saveUninitialized: false
}));
app.use(express.urlencoded({extended: false}));
app.use(flash());
app.use('/register',regroute);


  ////Routing
  app.get('/',(req,res)=>{
      res.render('index.ejs');
  });
  
  app.get('/login',(req,res)=>{
      res.render('login.ejs');
  });
  
  app.get('/register',(req,res)=>{
      res.render('register.ejs');
  });
  
    

下面是我的Register.js:

const express=require('express');
const router=express.Router();


router.post('/register',async (req,res)=>{
  const {name,email,password,cpassword}=req.body;
  if(password!=cpassword){
  req.flash('error', 'Passwords do not match');
  return res.redirect('/register');
}

////Setting a query to check if an email already exist

try{
  const queryAsync = util.promisify(connection.query).bind(connection);
  const results = await queryAsync('SELECT * FROM users WHERE email=?', [email]);
    if(results.length> 0 ){
      console.log('email found');
        req.flash('error', 'Email already exists');
        return res.redirect('/register');
    }

const hashedpassword=await bcrypt.hash(password,10);
connection.query('insert into users (user_name,email,password) values (?,?,?)',[name,email,hashedpassword])
}catch(e){
  console.log('here is the error',e);
  req.flash('error','error occured please try again');
  return res.redirect('/register');
}

res.redirect('/login');
});

module.exports=router;

推荐答案

在您的代码中,您使用以下行将路由设置为/register路径:

app.use('/register', regroute)

但在路由代码中,您还使用了路径/register:

router.post('/register', async (req, res)=>{
    // ...
});

最后,要访问路由的POST方法路由,您需要向/register/register路径而不是/register发送请求.

否则,您可以通过更改路由中的路由路径来解决错误,如下所示:

router.post('/', async (req, res)=>{
    // ...
});

这样,您就可以访问路径为/register的路由.

In general, when you configure an express.js router, you set a default path for all the routes in that router.

E.g.

index.js

const myRouter = require('myRouter.js');

// ...

app.use('/app', myRouter);

myRouter.js

// ...

router.post('/route1', (req, res) => { /* ... */ }); // Accessible at /app/route1
router.get('/route2', (req, res) => { /* ... */ }); // Accessible at /app/route2

// ...

Javascript相关问答推荐

在JavaScript中使用setProperty方法试图修改css元素值时,我遇到错误

文件阅读器未读取一个文件

用户单击仅在JavaScript中传递一次以及其他行为

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

将json数组项转换为js中的扁平

嵌套异步JavaScript(微任务和macrotask队列)

我们如何从一个行动中分派行动

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

如何将innerHTML字符串修剪为其中的特定元素?

扩展类型的联合被解析为基类型

在VS代码上一次设置多个变量格式

自定义图表工具提示以仅显示Y值

无法重定向到Next.js中的动态URL

P5.js中的分形树

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时