如何使用身体的解析器环回?

问题描述 投票:21回答:8

我看到,回送的快递3.X中间件内置。事实上,身体的解析器是loopback/node_modules。但我无法弄清楚如何使用它作为中间件。我从来没有与快车3.x的工作,所以也许它只是。 require不起作用,很明显,除非我安装身体解析器在我的项目的依赖。

我应该在server.js用肢体解析器做到让网页表单被解析成req.params?这就是它做什么,对不对?

node.js express middleware loopbackjs body-parser
8个回答
50
投票

经过挫折小时,我只是说它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."})
    });
}

25
投票

(!因为我还发现这个答案后,挣扎了一会),只要是需要什么来得到这个工作更加清晰,这里是我采取的步骤:

如上所述,在$ APP_HOME /服务器/ middleware.json,体解析器添加到“解析”部分:

{
  "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.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 /普通/型号/ 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运行的应用程序。

当我发布到终点,它现在被正确解析,一切都很好与世界同步。我希望这可以帮助别人!


9
投票

我使用的是环回2.14.0:

要利用身体解析器在您的自定义启动脚本的路线,你只需要:

1)安装体的解析器 npm install body-parser --save

2)寄存器中的middleware.json模块

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

有没有必要要求server.js解析器的设置,当你注册中间件环回做这个给你。

请注意身体解析器现已安装在您的源“node_modules”目录以及在环回modules目录。

如果可能的话尽量作为loopback documentation描述注册自定义的远程方法。

注册路线这样,您可以访问回环的身体解析器开箱,是“干净”的实现。


3
投票

基于从本卡尔森这个答案https://stackoverflow.com/a/29813184/605586你必须

npm install --save body-parser multer

然后在server.js需要的模块:

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

和app.start之前使用它们:

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

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

App.incoming = function (req, cb) {
    console.log(req);
    // the files are available as req.files.
    // the body fields are available in req.body
    cb(null, 'Hey there, ' + req.body.sender);
}
App.remoteMethod(
    'incoming',
    {
    accepts: [
        {
        arg: 'req', type: 'object', http: function (ctx) {
            return ctx.req;
        }
        }],
    returns: { arg: 'summary', type: 'string' }
    }
);

使用此您可以上传文件和其他数据的字段的multipart / form-data的环回。


2
投票

我张贴这只是参考。我遇到了同样的问题,发现这个工作也是如此。您可以在以下服务器的/ boot /目录中添加一个文件:

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

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

当然,你必须通过运行安装程序包:

npm install --save body-parser

这将节省node_modules目录下的包。如果你希望它是运行的第一件事情,你可以用一个“0”开头的文件名,因为这些按字母顺序加载。

话虽这么说,我想,这是更“正确”和优雅的使用上面提到的比这个中间件配置方法,但我在事件他人分享其他人发现它是有用的。


2
投票

在环回^ 3.22.0,我可以通过添加足够

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

要以消耗在服务器的/ boot / routes.js应用/ JSON后机构的服务器/ middleware.json

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

0
投票

我有不同的测试结果。

1)对JSON和用urlencode类型,没有必要增加自己的解析器middleware.json。我可以从req.body数据成功而不增加身体解析器#JSON和身体解析器#urlencoded的。环回应该已经支持他们。

环回相关的源代码(我认为)

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)对于原始类型,我们可以在“分析”部分中middleware.json补充身体的解析器#原料,当然,它需要安装NPM身体的解析器。

我的测试代码:

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

0
投票

人们还可以使用快速框架的内置解析器内部环回这样的,例如用于JSON解析:app.use(app.loopback.json());

© www.soinside.com 2019 - 2024. All rights reserved.