MIME 与 Nodejs 的小故事

之前同学问了我一个问题,他用 Java 写的客户端并发出的请求在 Java 的服务端可以接收,他想改成 Node.js 的服务端,但是就遇到了没法正确处理的问题。

经过 Header 的查看,首先我们发现了 Header 中没有 content-type,最初我的思考角度在于 content-type 没有的情况下,会不会存在 Java 服务端的默认值而 Node.js 的服务器并没有处理。由于他说传的是二进制文件,想当然的想到了 multipart/form-data,但是对于 multipart 而言,应该是有特殊首部要求的,明显不满足这个条件。

后来查了很久,才发现 MDN 中有这么一句话:

对于 text 文件类型若没有特定的 subtype,就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream

现在我们知道了 header,下一步就是怎么处理了,因为 koa-body 不对这种类型进行处理,而 express 的 body-parser 中已经带了 raw 方法来处理这种情况,可以直接使用,koa 也有人做了一个中间件 raw-body

更重要的是,我们仍然想要了解到底发生了啥,到底要怎么写,于是我们翻到了 Node 官方的帮助 demo,借此自己糊了一个 middleware:

const Koa = require('koa')
const app = new Koa()

const mid = (ctx, next) => {
  const req = ctx.req
  const body = []
  req.on('data', (chunk) => body.push(chunk))
  req.on('end', () => {
    ctx.request.body = body 
    next()
  })
}


app.use(mid)
app.use((ctx, next) => {
  console.log(ctx.request.body)
})

app.listen(3000)

参考链接:

如果您觉得文章不错,可以通过赞助支持我

标签: node.js, http

添加新评论