LoopBackにはExpress 3.xミドルウェアが組み込まれていることがわかります。実際、body-parserはloopback/node_modules
にあります。しかし、それをミドルウェアとして使用する方法がわかりません。私はExpress 3.xで作業したことがないので、それだけかもしれません。プロジェクトに依存関係としてbody-parserをインストールしない限り、require
は機能しません。
Webフォームがserver.js
に解析されるようにbody-parserを使用するには、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."})
});
}
これを機能させるために何が必要かをもっと明確にするために(この答えを見つけた後もしばらく苦労したので!)、私が取った手順は次のとおりです:
上記のように、$ 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 runでアプリを実行できます。
エンドポイントに投稿すると、正しく解析されるようになり、すべてが順調に進んでいます。これが他の誰かの役に立つことを願っています!
ループバック2.14.0を使用しています。
カスタムブートスクリプトルートで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でパーサーを設定する必要はありません。ミドルウェアを登録するときにループバックがこれを行います。
ボディパーサーがソースの「node_modules」ディレクトリとループバックモジュールディレクトリにインストールされていることに注意してください。
ループバックのドキュメント の説明に従って、可能な限りカスタムリモートメソッドを登録してください。
この方法でルートを登録すると、ループバックのbody-parserにすぐにアクセスできるようになり、「最もクリーンな」実装になります。
この回答に基づいて 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でループバックできます。
これは情報提供のみを目的として投稿しています。私はこれと同じ問題に遭遇し、これも動作することを発見しました。次のコマンドを使用して、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」で始めることができます。
そうは言っても、上記のミドルウェア構成アプローチを使用する方がこれよりも「正確」でエレガントだと思いますが、他の誰かが有用だと思った場合は共有します。
ループバック^ 3.22.0では、
"parse": {
"body-parser#json": {}
},
server/boot/routes.jsでapplication/jsonの投稿本文を使用するために、server/middleware.jsonに
module.exports = function(app) {
app.post('/api/sayhello', function(req, res, next) {
console.log(req.body)
次のように、ループバック内のエクスプレスフレームワークの組み込みパーサーを使用することもできます。たとえば、jsonパーシング:app.use(app.loopback.json());
テスト結果が異なります。
1)jsonおよびurlencodeタイプの場合、middleware.jsonにパーサーを追加する必要はありません。 body-parser#jsonとbody-parser#urlencodedを追加しなくても、req.bodyからデータを正常に取得できます。ループバックはすでにそれらをサポートしているはずです。
ループバック関連のソースコード(私は思う)
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)rawタイプの場合、middleware.jsonの「解析」部分にbody-parser#rawを追加できます。もちろん、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",