javascript - Express.js POST 方法不起作用

标签 javascript node.js express mongoose pug

我正在尝试制作一个基于讨论的 Node.js/Express-app,并且我正在页面上创建讨论。我只是测试我的讨论 Controller 文件是否已链接,但每次我单击按钮来发布我的表单时,它都不会执行任何操作。

我的哈巴狗( View ),名为“createDisc.pug”

extends layout
block content
    h1 Create new discussion
    form(action='', method='post')
    div
        label(for='title') Title
        input#title
    div
        label(for='desc') Description
        input#desc
    div
        input(type='submit', value='Create')

我的路由器,名为“createDisc.js”

var express = require('express');
var router = express.Router();
var disc = require('../controllers/disc');

router.get('/discussion/create', function (req, res, next) {
    res.render('createDisc');
});

router.post('/discussion/create', disc.createDisc);

module.exports = router;

我的 Controller 名为“disc.js”,我只是想将“测试”发送到我的控制台

exports.createDisc = function (req, res, next) {
    console.log('test');
};

我的 app.js 文件

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const passport = require('passport');
const path = require('path');
const cookieParser = require('cookie-parser');
const session = require('express-session');

const app = express();

const db = require('./controllers/db');

require('./config/passport')(passport);

mongoose.connect(db.url);

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser());
app.use('/', require('./routes/createDisc'));

app.listen(3000, function() {
    console.log('Example listening on port 3000!')
})

最佳答案

您提到 /discussion/create 作为您的 GET 路由并将其链接到快速路由器,例如:

router.get('/discussion/create', function (req, res, next) {
    res.render('createDisc');
});

router.route('/discussion/create', disc.createDisc);

所以实际上,您正在启用类似以下的路线:

GET/讨论/创建/讨论/创建

请尝试使用 .post() Hook 并使用它,如下所示:

router.post('/', function (req, res, next) {
    res.render('createDisc');
});

router.route('/discussion', disc.createDisc);

引用: http://expressjs.com/en/guide/routing.html

提示:请参阅此链接以创建更有意义的路线。 https://github.com/squareboat/api-guidelines#http-methods

更新#1

目前,在您的 HTML(pug) 表单中,您有 action='',这意味着您的表单正在向 POST/ 发出请求。

请将操作值更改为 action='/discussion/create' 并重试。

更新#2

我已经制作了您的代码的精简版本(没有 View 或数据库),并且它运行良好。你可以看到代码here .

要测试的路线是:

GET http://localhost:3000/discussion/create

POST http://localhost:3000/discussion/create

更新 #3

在您的 pug 文件中,您的缩进是错误的,因为输入字段未包含在表单标记内。您有一个空表格。

extends layout
block content
    h1 Create new discussion
        form(action='/discussion/create', method='post')
            div
                label(for='title') Title
                input#title
            div
                label(for='desc') Description
                input#desc
            div
                input(type='submit', value='Create')

这会起作用。

关于javascript - Express.js POST 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45780590/

相关文章:

javascript - Mongoose 不保存数据

node.js - 网站图片无法加载,但其他静态文件可以加载

node.js - req.session.passport 为空,未调用 deserializeUser - ExpressJS,Passport

javascript - 是否可以以编程方式模拟按键事件?

javascript - cufon 帮助嵌入 2 种字体,忽略第一条规则

javascript - RSpec/Capybara 检查未触发 onChange 事件

node.js - 如何访问 AWS Lambda 中的 header ?

javascript - flowjs 0.54.0 中的新 "Missing annotation"错误

javascript `require` 而不是 Node.js 中的 Three.js 文件中的 html `script`

javascript - 如何使用 javascript scrollIntoView() 转到 id ,并在页面中间?