GVKun编程网logo

Express 加载无穷大并且在使用 Express body Parser 时不起作用

17

最近很多小伙伴都在问Express加载无穷大并且在使用ExpressbodyParser时不起作用这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展7~express~body-pa

最近很多小伙伴都在问Express 加载无穷大并且在使用 Express body Parser 时不起作用这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展7 ~ express ~ body-parser 模块的使用、body-parser Node.js(Express) HTTP请求体解析中间件、bodyParser 已弃用 express 4、bodyParser弃用Express 4等相关知识,下面开始了哦!

本文目录一览:

Express 加载无穷大并且在使用 Express body Parser 时不起作用

Express 加载无穷大并且在使用 Express body Parser 时不起作用

如何解决Express 加载无穷大并且在使用 Express body Parser 时不起作用?

我已经使用 Express 实现了一个 API,但是一旦我使用集成在 Express 中的正文解析器,该 API 就不再起作用。当我调用 API 时,请求需要无限长的时间来加载,而 Express 根本不会对其做出反应。一旦我停止使用正文解析器,请求就会再次正常工作。

代码:

const Express = require("express")
const db = require("./database")

const app = Express()

app.use(Express.json)

app.get("/api",((req,res) => {
  res.status(200).send("The API is working")
}))

app.post("/api/user/:id/settings",(req,res) => {
  console.log("It works")
  db.edit({user: req.params.id},req.body,"user").catch(err => {
    res.status(500).send(err)
    console.error(err)
  }).then(() => {
    res.status(200)
  })
})

app.listen(3000)
console.log("API is ready")

Node.js 版本:16.0.0 快递版本:4.17.1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

7 ~ express ~ body-parser 模块的使用

7 ~ express ~ body-parser 模块的使用

一,安装 : npm install body-parser

二,加载 : var bodyParser = require(''body-parser'')

三,配置 : https://github.com/expressjs/body-parser    

调用  bodyParser.urlencoded([options]) 

 

app.use(bodyParser.urlencoded({extended:true}))
 
四,api.js  通过 req.body 获取 post 提交的数据
 
var express = require(''express'')
var router = express.Router()

/**
* 统一接口的返回格式
*/
var responseData;
router.use((req,res,next)=>{
//初始化返回数据
responseData = {
  code:0 , // 返回的错误码,默认为0 , 0表示没有错误
  message:'''' , // 错误信息 。没有错误的情况下默认为空
}
 
/**
* 【 不执行 next ,程序会卡在此处 】
*/
  next()
})

/**
* 用户注册
*    注册逻辑
*
*    1,用户名,密码不能为空
*    2,两次输入密码是否一致
*
*    1,用户是否已经被注册
*    数据库查询
*/
router.post(''/user/register'',(req,res,next)=>{
  console.log(req.body)
 
  // 将 传过来的数据 保存 到变量中
  var username = req.body.username
  var password = req.body.password
  var repassword = req.body.repassword

  //判断用户是否为空
  if(username == ''''){
    responseData.code = 1
    responseData.message = ''用户名不能为空''
    /**
    * 将数据返回前端
    * 以 json 的形式
    */
    res.json(responseData)
    return
  }

  //判断密码是否为空
  if(password == ''''){
    responseData.code = 2
    responseData.message = ''密码不能为空''
    res.json(responseData)
    return
  }

  // 判断两次输入密码是否一致
  if(password != repassword){
    responseData.code = 3
    responseData.message = ''两次输入密码不一致''
    res.json(responseData)
    return
  }
 
  //注册成功
  responseData.message = ''注册成功''
  res.json(responseData)
})

module.exports = router

body-parser Node.js(Express) HTTP请求体解析中间件

body-parser Node.js(Express) HTTP请求体解析中间件

body-parser Node.js(Express) HTTP请求体解析中间件

 2016年06月08日     781     声明

 

在HTTP请求中,POSTPUTPATCH三种请求方法中包含请求体,Node.js 原生HTTP模块中,请求体要基于流的方式接收和解析。body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件。

  1. 请求体解析
    • 1.1 原生环境中的解析
    • 1.2 使用body-parser解析请求体
  2. 请求体解析
    • 2.1 bodyParser.json() - 解析JSON格式
    • 2.2 bodyParser.raw() - 解析二进制格式
    • 2.3 bodyParser.text() - 解析文本格式
    • 2.4 bodyParser.urlencoded() - 解析文本格式

1. 请求体解析

1.1 原生环境中的解析

Node.js 原生HTTP模块中,是将用户请求数据封装到了用于请求对象req中,该对象是一个IncomingMessage,该对象同时也是一个可读流对象。在原生HTTP服务器,或不依赖第三方解析模块时,可以像下面这样接收并解析请求体:

const http = require(''http'');

//用http模块创建一个http服务端 
http.createServer(function(req, res) {
  if (req.method.toLowerCase() === ''post'') {
    var body = '''';   
    req.on(''data'', function(chunk){
      body += chunk;
    });

    req.on(''end'', function(){
      if(req.headers[''content-type''].indexOf(''application/json'')!==-1){
        // JSON 格式请求体解析
        JSON.parse(body);
      } else if(req.headers[''content-type''].indexOf(''application/octet-stream'')!==-1){
        // Raw 格式请求体解析
        // ……
      } else if(req.headers[''content-type''].indexOf(''text/plain'')!==-1){
        // text 文本格式请求体解析
        // ……
      } else if(req.headers[''content-type''].indexOf(''application/x-www-form-urlencoded'')!==-1){
        // URL-encoded 格式请求体解析
        // ……
      } else {
      	// 其它格式解析
      }
    })
  } else {
    res.end(''其它提交方式'');
  }
}).listen(3000);

 

1.2 使用body-parser解析请求体

body-parser模块是一个Express/Connect中间件,它使用非常简单且功能强大,可以像下面这样用这个模块解析请求体:

Express/Connect 项层处理

Express框架默认使用body-parser做为请求体解析中间件,创建Express项目后,可以在app.js文件中看到如下代码:

/* 引入依赖项 */
var express = require(''express'');
// ……
var bodyParser = require(''body-parser'');

var routes = require(''./routes/index'');
var users = require(''./routes/users'');

var app = express();

// ……

// 解析 application/json
app.use(bodyParser.json());	
// 解析 application/x-www-form-urlencoded
app.use(bodyParser.urlencoded());

这样就在项目的Application级别,引入了body-parser模块处理请求体。在上述代码中,模块会处理application/x-www-form-urlencodedapplication/json两种内容格式的请求体。经过这个中间件处理后,就可以在所有路由处理器的req.body中访问请求参数。

解析Express具体路由

在实际应用中,不同路径(路由)可能会要求用户使用不同的内容类型,body-parser还支持为单个Express路由添加请求体解析:

var express = require(''express'')
var bodyParser = require(''body-parser'')

var app = express()

// 创建 application/json 解析
var jsonParser = bodyParser.json()

// 创建 application/x-www-form-urlencoded 解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login 获取 URL编码的请求体
app.post(''/login'', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send(''welcome, '' + req.body.username)
})

// POST /api/users 获取 JSON 编码的请求体
app.post(''/api/users'', jsonParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  // create user in req.body
})

指定请求类型

body-parser还支持为某一种或一类内容类型的请求体指定解析方式,指定时可以通过在解析方法中添加type参数修改指定Content-Type的解析方式。

如,可以对text/plain内容类型使用JSON解析:

app.use(bodyParser.json({ type: ''text/plain'' }))

这一选项更多是用在非标准请求头的解析中,如下:

// 解析自定义的 JSON
app.use(bodyParser.json({ type: ''application/*+json'' }))

// 解析自定义的 Buffer
app.use(bodyParser.raw({ type: ''application/vnd.custom-type'' }))

// 将 HTML 请求体做为字符串处理
app.use(bodyParser.text({ type: ''text/html'' }))

 

2. body-parser模块的API

通过npm install body-parser命令安装模块后,可以通过以下方式获取模块引用:

var bodyParser = require(''body-parser'')

bodyParser变量是对中间件的引用。请求体解析后,解析值都会被放到req.body属性,内容为空时是一个{}空对象。

2.1 bodyParser.json() - 解析JSON格式

bodyParser.json(options)

返回一个仅解析json格式数据的中间件。这个方法支持任意Unicode编码的请求体,且支持gzipdeflate编码的数据压缩。

Option是一个包含以下可选值的对象

  • inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true
  • limit - 设置请求的最大数据量。默认为''100kb''
  • reviver - 传递给JSON.parse()方法的第二个参数,详见JSON.parse()
  • strict - 设置为true时,仅会解析ArrayObject两种格式;设置为false会解析所有JSON.parse支持的格式。默认为true
  • type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/json
  • verify - 这个选项仅在verify(req, res, buf, encoding)时受支持

 

2.2 bodyParser.raw() - 解析二进制格式

bodyParser.raw(options)

返回一个将所有数据做为Buffer格式处理的中间件。这个方法支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个Buffer数据。

Option是一个包含以下可选值的对象

  • inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true
  • limit - 设置请求的最大数据量。默认为''100kb''
  • type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream
  • verify - 这个选项仅在verify(req, res, buf, encoding)时受支持

 

2.3 bodyParser.text() - 解析文本格式

bodyParser.text(options)

返回一个仅处理字符串格式处理的中间件。这个方法支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个字符串值。

Option是一个包含以下可选值的对象

  • defaultCharset - 如果Content-Type后没有指定编码时,使用此编码。默认为''utf-8''
  • inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true
  • limit - 设置请求的最大数据量。默认为''100kb''
  • type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream
  • verify - 这个选项仅在verify(req, res, buf, encoding)时受支持

 

2.4 bodyParser.urlencoded() - 解析文本格式

bodyParser.urlencoded(options)

返回一个处理urlencoded数据的中间件。这个方法默认使用UTF-8编码,且支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个键值对对象。

Option是一个包含以下可选值的对象

  • extended - 当设置为false时,会使用querystring库解析URL编码的数据;当设置为true时,会使用qs库解析URL编码的数据。后没有指定编码时,使用此编码。默认为true
  • inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true
  • limit - 设置请求的最大数据量。默认为''100kb''
  • parameterLimit - 用于设置URL编码值的最大数据。默认为1000
  • type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream
  • verify - 这个选项仅在verify(req, res, buf, encoding)时受支持

bodyParser 已弃用 express 4

bodyParser 已弃用 express 4

我正在使用 express 4.0,并且我知道正文解析器已从 express 核心中取出,我正在使用推荐的替换,但是我得到了

body-parser deprecated bodyParser: use individual json/urlencoded middlewaresserver.js:15:12 body-parser deprecated urlencoded: explicitly specify"extended: true" for extended parsing node_modules/body-parser/index.js:74:29

我在哪里可以找到这个所谓的中间件?还是我不应该收到这个错误?

var express     = require(''express'');var server      = express();var bodyParser  = require(''body-parser'');var mongoose    = require(''mongoose'');var passport    = require(''./config/passport'');var routes      = require(''./routes'');mongoose.connect(''mongodb://localhost/myapp'', function(err) {    if(err) throw err;});server.set(''view engine'', ''jade'');server.set(''views'', __dirname + ''/views'');server.use(bodyParser()); server.use(passport.initialize());// Application Level Routesroutes(server, passport);server.use(express.static(__dirname + ''/public''));server.listen(3000);

答案1

小编典典

这意味着截至 2014 年 6 月 19 日,使用bodyParser() 构造函数
已被弃用。

app.use(bodyParser()); //Now deprecated

您现在需要分别调用这些方法

app.use(bodyParser.urlencoded());app.use(bodyParser.json());

等等。

如果您仍然收到警告,urlencoded则需要使用

app.use(bodyParser.urlencoded({  extended: true}));

现在extended需要显式传递配置对象键,因为它现在没有默认值。

如果您使用 Express >= 4.16.0,则在方法express.json()express.urlencoded().

bodyParser弃用Express 4

bodyParser弃用Express 4

我正在使用Express 4.0,并且我知道主体解析器已从Express核心中移除,我使用的是推荐的替代品,但是我得到了

body-parser deprecated bodyParser: use individual json/urlencoded middlewaresserver.js:15:12 body-parser deprecated urlencoded: explicitly specify"extended: true" for extended parsing node_modules/body-parser/index.js:74:29

我在哪里可以找到这个所谓的中间件?还是我不应该得到这个错误?

var express     = require(''express'');var server      = express();var bodyParser  = require(''body-parser'');var mongoose    = require(''mongoose'');var passport    = require(''./config/passport'');var routes      = require(''./routes'');mongoose.connect(''mongodb://localhost/myapp'', function(err) {    if(err) throw err;});server.set(''view engine'', ''jade'');server.set(''views'', __dirname + ''/views'');server.use(bodyParser()); server.use(passport.initialize());// Application Level Routesroutes(server, passport);server.use(express.static(__dirname + ''/public''));server.listen(3000);

答案1

小编典典

这意味着自2014年6月19日起,不赞成使用bodyParser()
构造函数

app.use(bodyParser()); //Now deprecated

您现在需要分别调用方法

app.use(bodyParser.urlencoded());app.use(bodyParser.json());

等等。

如果仍然收到警告,则urlencoded需要使用

app.use(bodyParser.urlencoded({  extended: true}));

extended现在的配置对象的关键需要明确的被传递,因为它现在已经没有默认值。

如果您使用的快递> = 4.16.0,身体解析器已根据这些方法重新加入express.json()express.urlencoded()

今天的关于Express 加载无穷大并且在使用 Express body Parser 时不起作用的分享已经结束,谢谢您的关注,如果想了解更多关于7 ~ express ~ body-parser 模块的使用、body-parser Node.js(Express) HTTP请求体解析中间件、bodyParser 已弃用 express 4、bodyParser弃用Express 4的相关知识,请在本站进行查询。

本文标签: