【问题标题】:client-side DEL request in express.jsexpress.js 中的客户端 DEL 请求
【发布时间】:2013-12-04 00:14:31
【问题描述】:

我正在尝试使用 express.js 设置一个简单的 REST API。从客户端实现删除功能时遇到问题。

路线:

module.exports = function(server) { 
  server.get('/entries/:id', entries.get)    // working
  server.del('/entries/:id', entries.destroy)// not working
}

我有一个像这样设置的虚拟删除按钮(使用 handlebars.js):

<form id='deleteform' action={{path}} method='POST'>
  <input type='hidden' name='_method' value='DEL' />
  <input type='hidden'  name='_csrf' value={{csrf_token}} />
  <button class='submit' type='submit' name='DELETE'>
</form>

当我单击按钮时,我得到“无法 POST /entries/1386113642”或我将 {{path}} 设置为的任何其他 url - 但是,相同 url 的 GET 请求工作正常。我还在我的快速配置文件中设置了 methodOverride() 。我在这里做错了什么?

编辑:这是我的整个 app.configure() 调用:

    app.configure(function() {
        app.use(function(req, res, next) {
            res.locals.pkg = pkg
            next()  
        })
    app.use(express.favicon())
    var rootPath = path.normalize(__dirname + '/..')
    var basePath = path.normalize(__dirname + '/../..')
    app.use(express.static(rootPath + '/public'))
    app.use(express.static(basePath + '/backbone/'))
    app.set('views', __dirname + '/../../static')
    app.engine('hbs', exphbs({
       defaultLayout: 'main',
       extname: '.hbs',
       partialsDir: '../static',
       layoutsDir: '../static/layouts'
    }))
    app.set('view engine', '.hbs')
        app.use(express.cookieParser())
        app.use(express.bodyParser())
        app.use(express.methodOverride())
        app.use(express.session({
            secret: 'aekugwieufgkdjfhaisuefhwijfeijf',
            store:  new RedisStore({host:'localhost', port: 6379, client: redis })
        }))

    app.use(function(req, res, next) {
      res.locals.csrf_token = req.session._csrf
      next()
    })

        if (process.env.NODE_ENV !== 'test') {
                app.use(express.csrf())
            }
    app.use(app.router) 
  })
}

【问题讨论】:

    标签: javascript rest express


    【解决方案1】:

    DEL 应该是DELETE

    <input type='hidden' name='_method' value='DELETE' />
    

    【讨论】:

    • 天哪,就是这样。现在我有那个程序员的悔恨,他花了很多时间在一个简单的解决方案上拖延。不过谢谢!!
    【解决方案2】:

    我的 express 配置文件中也设置了 methodOverride()

    发布此代码。它不是配置文件。它是对中间件函数的顺序高度敏感的代码。特别要确保bodyParser 出现在methodOverride 之前,而app.router 之前。

    【讨论】:

    • 是的,我猜“配置文件”是错误的术语。这是我进行所有快速配置的文件。我刚刚检查过,我肯定以正确的顺序调用了你提到的函数。
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2023-03-28
    • 2011-12-12
    相关资源
    最近更新 更多