我看到LoopBack内置了Express 3.x中间件。实际上,身体解析器在loopback/node_modules
。但我无法弄清楚如何将其用作中间件。我从未使用Express 3.x,所以也许就是这样。显然,require
不起作用,除非我在我的项目中安装了body-parser作为依赖项。
我应该在server.js
中使用正文解析器,以便将网络表单解析为req.params
?这就是它的作用,对吗?
答案 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