我怎样才能用LoopBack使用body-parser?

我看到LoopBack内置了Express 3.x中间件。 事实上,body-parser是在loopback/node_modules 。 但我不知道如何将其用作中间件。 我从来没有使用Express 3.x,所以也许就是这样。 require显然不起作用,除非我在我的项目中安装body-parser作为依赖项。

我应该怎么做在server.js使用身体分析器,以便Web窗体被parsing成req.params ? 就是这样,对吗?

经过几个小时的挫折之后,我把它添加到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."}) }); } 

只是为了更清楚地知道如何才能做到这一点(因为在find答案之后我仍然挣扎了一会儿),下面是我采取的步骤:

如上所述,在$ 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": {} } } 

接下来,我将parsing器设置添加到$ 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 run来运行我的应用程序。

当我发布到端点时,它现在得到了正确的parsing,并且与世界一切都很好。 我希望这可以帮助别人!

我使用loopback 2.14.0:

要在自定义的脚本path中使用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中设置parsing器,当你注册中间件的时候,loopback会为你做这件事。

请注意bodyparsing器现在安装在源“node_modules”目录以及loopback modules目录中。

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

通过这种方式注册路由,您可以访问开箱即用的环回主体parsing器,并且是“最干净的”实现。

我发布这只是为了信息的目的。 我遇到了同样的问题,并发现这也适用。 您可以使用以下命令在服务器/ boot /目录中添加一个文件:

 var bodyParser = require('body-parser'); module.exports = function(app) { app.use(bodyParser.urlencoded({ extended: true })); } 

当然,您必须运行以下命令安装软件包:

 npm install --save body-parser 

这将保存在node_modules目录下的包。 如果你想让它成为第一个运行的东西,你可以用“0”来启动文件名,因为这些文件是按字母顺序加载的。

这就是说,我认为使用上面提到的中间件configuration方法比这个更加“正确”和优雅,但是在别人认为它有用的情况下我会分享它。

我有不同的testing结果。

1)对于json和urlencodetypes,不需要在middleware.json中添加它们的parsing器。 我可以成功地从req.body中获取数据,而无需添加body-parser#json和body-parser#urlencoded。 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)对于原始types,我们可以在middleware.json的“parse”部分添加body-parser#raw,当然需要npm install body-parser。

我的testing代码:

 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",