【问题标题】:Express.js POST method doesn't workExpress.js POST 方法不起作用
【发布时间】:2018-01-28 13:16:57
【问题描述】:

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

我的哈巴狗(视图),名为“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;

我的控制器名为“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!')
})

【问题讨论】:

  • 你在哪里使用.post()钩子?
  • 我改了,router.route现在说,router.post,我原本打算做的@Baruch

标签: javascript node.js express mongoose pug


【解决方案1】:

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

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

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

所以实际上,您启用的路线类似于:

GET /discussion/create/discussion/create

请尝试使用.post() 钩子并像这样使用它:

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

我已经为你的代码做了一个精简的版本(没有视图或数据库),它运行良好。你可以看到代码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')

这会起作用。

【讨论】:

  • 好的,感谢您的回复,我不小心用'.route'复制了我的版本,但我的意思是'.post',我在上面的原始帖子中更改了它。我想我仍然需要使用 GET 路由来渲染 /discussion/create 吗?我只需要发布表单,以便我可以看到 console.log('test') 工作,但现在当我使用“创建”按钮提交表单时它仍然没有任何作用。
  • 如果我将操作更改为 '/discussion/create' 仍然不执行任何操作
  • 好的,谢谢,我安装了文件,GET-route localhost:3000/discussion/create 工作得很好,但是我如何到达 POST-route?
  • 我相信这两条路线都在发挥作用。请尝试使用 postman 向路由 /discussion/create 发出 post 请求。
  • 很好,谢谢,邮递员确实可以处理您的文件,我会在我的项目中尝试一下,也许我可以通过这种方式找到问题。
【解决方案2】:

试着把表格改成这样:

form(method='post', action='./create') 

看看有没有效果

【讨论】:

  • 请附上您的路由器
  • 谢谢,但那不行,我的路由器应该包含在上面的帖子中吗?
  • 这就是我所拥有的,现在,我只想看看 disc.js 文件是否会响应并执行 console.log
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2018-08-23
  • 2015-03-19
  • 2012-05-31
  • 2019-01-07
  • 2015-04-27
  • 1970-01-01
相关资源
最近更新 更多