如何在LoopBack中使用body-parser?

Ant*_*shy 22 middleware node.js express loopbackjs body-parser

我看到LoopBack内置了Express 3.x中间件.确实,身体解析器在loopback/node_modules.但我无法弄清楚如何将其用作中间件.我从未使用Express 3.x,所以也许就是这样.require显然,除非我在我的项目中安装body-parser作为依赖项,否则它不起作用.

我该怎么做server.js才能使用body-parser来解析web表单req.params?这就是它的作用,对吧?

Ant*_*shy 51

经过几个小时的挫折之后,我就把它添加到middleware.json这样:

"parse": {
    "body-parser#json": {},
    "body-parser#urlencoded": {"params": { "extended": true }}
}
Run Code Online (Sandbox Code Playgroud)

它作为依赖项安装.现在我req.body在我的路线中有表格数据.我server/boot/routes.js看起来像这样:

module.exports = function(app) {
    app.post('/mailing_list', function(req, res) {
        console.log(req.body.email);
        res.send({"status": 1, "message": "Successfully added to mailing list."})
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 经过半小时的研究,我看到了您的答案及其完美。 (2认同)

Ben*_*son 25

为了更清楚地知道如何使这个工作(因为我在找到这个答案后仍然挣扎了一段时间!),这里是我采取的步骤:

如上所述,在$ APP_HOME/server/middleware.json中,将body-parser添加到"parse"部分:

{
  "initial:before": {
    "loopback#favicon": {}
  },
  "initial": {
    "compression": {},
    "cors": {
      "params": {
        "origin": true,
        "credentials": true,
        "maxAge": 86400
      }
    }
  },
  "session": {
  },
  "auth": {
  },
  "parse": {
    "body-parser#json": {},
    "body-parser#urlencoded": {"params": { "extended": true }}
  },
  "routes": {
  },
  "files": {
  },
  "final": {
    "loopback#urlNotFound": {}
  },
  "final:after": {
    "errorhandler": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我将解析器设置添加到$ APP_HOME/server/server.js:

var loopback = require('loopback');
var bodyParser = require('body-parser');
var multer = require('multer');

var boot = require('loopback-boot');

var app = module.exports = loopback();

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.start = function() {
...
...
cont'd
Run Code Online (Sandbox Code Playgroud)

然后,由于我不想搞乱自定义路由,我将以下内容添加到$ APP_HOME/common/models/model.js:

module.exports = function(Model) {

  Model.incoming = function(req, cb) {
    cb(null, 'Hey there, ' + req.body.sender);
  }
  Model.remoteMethod(
    'incoming',
    { accepts: [
      { arg: 'req', type: 'object', http: function(ctx) {
        return ctx.req;
      } 
    }],
    returns: {arg: 'summary', type: 'string'}
    }
  );
};
Run Code Online (Sandbox Code Playgroud)

我现在可以用$> slc run运行我的应用程序.

当我发布到端点时,它现在可以正确解析,并且一切都很好.我希望这有助于其他人!

  • 这甚至没有为我启动.具体来说,行:``app.use(multer()); //解析multipart/form-data``没有用,除非我添加了一个函数multer().any() - 否则得到错误``equires middleware functions`` (7认同)
  • 如其他注释中所述,您不需要在server.js和middleware.json中指定解析配置.后者是首选方法. (3认同)

Lan*_*nce 9

我正在使用loopback 2.14.0:

要在自定义bootscript路径中使用body-parser,您只需要:

1)安装body-parser npm install body-parser --save

2)在middleware.json中注册该模块

"parse": {
"body-parser#json": {},
"body-parser#urlencoded": {"params": { "extended": true }}
},
Run Code Online (Sandbox Code Playgroud)

无需在server.js中设置解析器设置,当您注册中间件时,loopback会为您执行此操作.

请注意,正文解析器现在安装在源"node_modules"目录以及loopback模块目录中.

如果可能的话尝试注册环回文档中描述的自定义远程方法.

以这种方式注册路由使您可以开箱即用地访问loopback的body-parser,并且是"最干净"的实现.