【问题标题】:Howto Koa Router PUT done rightHowto Koa 路由器 PUT 做得对
【发布时间】:2018-07-17 14:09:44
【问题描述】:

[因为 koa-router 维护者想在 stackoverflow 上提问,所以我开了一个账户]

编辑这是关于你通过'npm install koa-router'得到的NPM

如何正确使用 Koa-Router 和 PUT 向服务器发送数据?

我会这样做:

// trivial stuff ommitted
router.put('/devices/myDevice',  (ctx, next) => {
    console.log('ctx:',ctx);
    ctx.body = "nothing in ctx which looks like my data: whatever"
    next();
});

和客户端:

fetch('http://localhost:3000/devices/myDevice',{
            method: 'PUT',
            data: "whatever"
        })
        .then(function(data){
            return data.json();
        }).then(function(res){
        })
        .catch(function(err) {
            console.log('Fetching myDevice Error:', err);
          });

这样做,我的 ctx 看起来像这样:

ctx: { request:
{ method: 'PUT',
 url: '/devices/myDevice',
 header:
  { host: 'localhost:3000',
    connection: 'keep-alive',
    'content-length': '0',
    origin: 'null',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 
     Safari/537.36',
    accept: '*/*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7' } },
    response:
    { status: 404,
    message: 'Not Found',
    header: { vary: 'Origin', 'access-control-allow-origin': 'null' } },
     app: { subdomainOffset: 2, proxy: false, env: 'development' },
    originalUrl: '/devices/myDevice',
    req: '<original node req>',
    res: '<original node res>',
     socket: '<original node socket>' }

正如大家所见,我得到了 404,但路由被触发到 console.log(ctx)... 我也看不到我尝试发送到服务器的数据。 Cors 标头是 btw 设置的。 GET 和 DELETE 等其他路由工作正常。

这是一个错误还是有人可以重现所描述的行为?

【问题讨论】:

  • 看起来这是一个抓取问题。 $.ajax({url:'...',headers:{"data":"foobar"}}) 用于请求服务器路由。

标签: node.js rest router put koa


【解决方案1】:

如果您只想返回发送的数据,请使用request.body 而不是response

ctx.body = ctx.request.body;

一般情况下,将PUT 请求视为与发布请求相同。

您还需要一个正文解析器中间件,例如 koa-bodyparser(link) 或 koa-body (link)。

【讨论】:

  • 感谢您的提示,但这不是我的问题。我已经编辑了问题以澄清事情。也许你有另一个想法。目前我认为这是一个获取问题。如果我使用 Chrome App ARC,我的服务器会正​​确回答。
  • @Dan - 这个问题还不清楚。发送给您的有效载荷不会在ctx.body,而是在ctx.request.body..
【解决方案2】:

正如您所提到的,这是您的fetch 的问题。它在选项中接受body 属性(不是data)。

示例用法:

fetch('http://localhost:3000/devices/myDevice', {
  method: 'PUT',
  body: JSON.stringify({ name: 'john', age: 30 })
})
  .then(function(data) {
    return data.json();
  })
  .then(function(res) {})
  .catch(function(err) {
    console.log('Fetching myDevice Error:', err);
  });

获取文档:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2019-03-26
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多