如何在LoopBack中使用body-parser?

时间:2015-02-15 06:58:27

标签: node.js express middleware loopbackjs body-parser

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

我应该在server.js中使用正文解析器,以便将网络表单解析为req.params?这就是它的作用,对吗?

8 个答案:

答案 0 :(得分:49)

经过数小时的挫折之后,我只是将其添加到middleware.json,如此:

"parse": {
    "body-parser#json": {},
    "body-parser#urlencoded": {"params": { "extended": true }}
}

它作为依赖项安装。现在我在我的路线中的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."})
    });
}

答案 1 :(得分: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": {}
  }
}

接下来,我将解析器设置添加到$ 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

然后,由于我不想搞乱自定义路由,我在$ 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'}
    }
  );
};

我现在可以使用$>运行我的应用slc跑。

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

答案 2 :(得分: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 }}
},

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

请注意,正文解析器现已安装在源“node_modules”目录以及loopback模块目录中。

如果可能的话,尝试按loopback documentation

中所述注册自定义远程方法

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

答案 3 :(得分:3)

根据本·卡尔森的答案https://stackoverflow.com/a/29813184/605586,您必须

[[ "$CIRCLE_TAG" = "" && "$CIRCLE_BRANCH" = "master" ]];

然后在server.js中需要以下模块:

npm install --save body-parser multer

并在app.start之前使用它们:

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

然后您可以创建一个远程方法:

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

使用此功能,您可以上传文件和其他数据字段以通过multipart / form-data进行环回。

答案 4 :(得分:2)

我发布此信息仅供参考。我遇到了同样的问题,发现这也有效。您可以使用以下命令在server / boot /目录中添加文件:

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

module.exports = function(app) {
  app.use(bodyParser.urlencoded({ extended: true }));
}

当然,您必须通过运行:

来安装软件包
npm install --save body-parser

这会将包保存在node_modules目录下。 如果您希望它是第一个运行的东西,您可以使用“0”启动文件名,因为它们按字母顺序加载。

话虽如此,我认为使用上面提到的中间件配置方法比使用这个方法更“正确”和优雅,但我会在别人认为有用的情况下分享它。

答案 5 :(得分:1)

在Loopback ^ 3.22.0中,我可以添加

"parse": {
    "body-parser#json": {}
  },

到服务器/middleware.json 为了使用server / boot / routes.js中的application / json帖子正文

module.exports = function(app) {
  app.post('/api/sayhello', function(req, res, next) {
     console.log(req.body)

答案 6 :(得分:0)

我的测试结果不同。

1)对于json和urlencode类型,不需要在middleware.json中添加它们的解析器。我可以成功地从req.body获取数据,而无需添加正文解析器#json和body-parser#urlencoded。 Loopback应该已经支持了它们。

Loopback相关源代码(我认为)

1. in strong-remote repo , rest-adapter.js , there is body-parser for json and urlendcoded

line 35
var json = bodyParser.json;
var urlencoded = bodyParser.urlencoded;

line 315
root.use(urlencoded(urlencodedOptions));
root.use(json(jsonOptions));

2. 
remote-object.js
line 33
require('./rest-adapter');

line 97
RemoteObjects.prototype.handler = function(nameOrClass, options) {
var Adapter = this.adapter(nameOrClass);
var adapter = new Adapter(this, options);
var handler = adapter.createHandler();

if (handler) {
// allow adapter reference from handler
handler.adapter = adapter;
}

return handler;
};

2)对于原始类型,我们可以在"解析"中添加body-parser#raw。部分在middleware.json中,当然,它需要npm install body-parser。

我的测试代码:

1.My readable stream is from the file uploadRaw.txt , the content is :
GreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaGreenTeaEeeeend

2. middleware.json
"parse": {
"body-parser#raw": {
"paths": [
"/api/v1/Buckets/?/upload"
]
}
},

3.
it('application/octet-stream -- upload non-form', () =>
new Promise((resolve) => {

const options = {

method: 'POST',

host: testConfig.server.host,

port: testConfig.server.port,

path: ${appconfig.restApiRoot}/Buckets/${TEST_CONTAINER}/upload,

headers: {

'Content-Type': 'application/octet-stream',

},
};

const request = http.request(options);

request.on('error', (e) => {
logger.debug(problem with request: ${e.message});
});

const readStream = fs.createReadStream('tests/resources/uploadRaw.txt');

readStream.pipe(request);

resolve();
}));

4.
Bucket.upload = (req, res, options, cb) => {

logger.debug('sssssss in uploadFileToContainer');

fs.writeFile('/Users/caiyufei/TEA/green.txt', req.body, (err) => {

if (err) {

logger.debug('oh, failed to write file');

return;
}

logger.debug('green file is saved!');
});

};

OR

Bucket.upload = (req, res, options, cb) => {

logger.debug('sssssss in uploadFileToContainer');

const writeStream = fs.createWriteStream('/Users/caiyufei/TEA/green.txt');

const streamOptions = {
highWaterMark: 16384,`enter code here`
encoding: null,
}

streamifier.createReadStream(Buffer.from(req.body), streamOptions).pipe(writeStream);

};

5. package.json

"body-parser": "^1.17.1",

"streamifier": "^0.1.1",

答案 7 :(得分:0)

还可以像这样在环回内部使用express框架的内置解析器,例如json解析: AAAAA\n BBBBBBB\n EEEE\n CCCCCC\n