Как я могу использовать body-parser с LoopBack?
Я вижу, что у LoopBack есть Express 3.х промежуточного встроенный. Действительно, body-parser находится в loopback/node_modules
. Но я не могу понять, как использовать его в качестве промежуточного ПО. Я никогда не работал с Express 3.Икс, может быть, дело в этом. require
не работает, очевидно, если я не устанавливаю body-parser как зависимость в моем проекте.
что делать server.js
использовать body-parser, чтобы веб-формы анализировались на req.params
? Это то, что он делает, верно?
7 ответов
после нескольких часов разочарования, я просто добавил его в 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 / модели / Модель.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 .
когда я отправляю сообщение в конечную точку, он теперь разбирается должным образом, и все хорошо с миром. Надеюсь, это поможет кому-то еще!
Я использую loopback 2.14.0:
чтобы использовать body-parser в пользовательских маршрутах bootscript, вам нужно только:
1) Установите body-parser
npm install body-parser --save
2) зарегистрируйте модуль в промежуточном по.в JSON
"parse": {
"body-parser#json": {},
"body-parser#urlencoded": {"params": { "extended": true }}
},
нет необходимости требовать установки парсера на сервере.js, loopback делает это для вас, когда вы регистрируете промежуточное ПО.
обратите внимание, что анализатор тела теперь установлен в вашем источнике " node_modules" каталог, а также в каталоге модулей loopback.
если вообще возможно, попробуйте зарегистрировать пользовательские удаленные методы, как описано в документация loopback.
Регистрация маршрутов таким образом дает вам доступ к синтаксическому анализатору тела loopback из коробки и является "самой чистой" реализацией.
на основе этого ответа https://stackoverflow.com/a/29813184/605586 от Бена Карлсона надо
npm install --save body-parser multer
затем на ваш сервер.js требуют модулей:
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
затем вы можете создать удаленный способ:
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' }
}
);
используя это, вы можете загружать файлы и дополнительные поля данных в loopback с помощью 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", так как они загружаются в алфавитном порядке.
это, как говорится, Я считаю, что более "правильно" и элегантно использовать упомянутый выше подход к конфигурации промежуточного программного обеспечения, но я разделяю его в случае, если кто-то еще найдет его полезным.
у меня другой результат теста.
1) для типов JSON и urlencode нет необходимости добавлять их парсер в промежуточное ПО.формат JSON. Я могу получить данные от рек.тело успешно без добавления 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) для типа raw мы можем добавить body-parser#raw в часть "parse" в промежуточном по.формат JSON конечно, для этого нужно установить npm 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",
можно также использовать встроенный парсер express framework внутри loopback, например, для синтаксического анализа json:
app.use(app.loopback.json());