Polymer: отправка запросов JSON ajax в серверную часть NodeJS
Я пытаюсь протестировать использование NodeJS в качестве серверного API для интерфейса Polymer. Со стороны Полимера у меня есть этот элемент iron-ajax:
<iron-ajax
id='test-req'
url='http://localhost:9090/backend-test'
handle-as='text'
on-response='testRsp'
body='{"data":"stuff"}'>
</iron-ajax>
Обработчик testRsp просто записывает текст ответа на консоль. На сервере это мой маршрут:
app.get('/backend-test', function(req, res){
res.send(req.body)
console.log(req.body)
}
Как видите, все, что он делает, это отвечает необработанным запросом и регистрирует запрос в бэкэнде. Обе стороны, как и ожидалось, имеют одинаковый результат, но, к сожалению, результат просто {}
,
Теперь я также попытался отправить json через атрибут params вместо атрибута body элемента iron-ajax, а в бэкэнде я использовал устаревшую функцию req.param() следующим образом: req.param('data')
и что правильно распечатывает stuff
как в браузере, так и в бэкэнде. Однако, поскольку это устарело, я пытаюсь избежать этого метода.
Какие-либо предложения?
Изменить: я подумал, что эта дополнительная информация будет полезна. Когда я вхожу req.originalUrl
на бэкэнд при передаче JSON в "Params", я получаю /backend-test?data=stuff
, При переходе в "тело", это просто /backend-test
,
Я также хочу отметить, что я также попробовал варианты промежуточного программного обеспечения bodyParser:
->app.use(bodyParser.json())
(результат, как отмечено выше)
->app.use(bodyParser.text())
(так же)
-> вообще не использует bodyParser (печатает undefined
как и ожидалось на основе экспресс-документов)
->app.use(bodyParser.text()); app.use(bodyParser.urlencoded({ extended: true }));
(тот же вывод, что и у json() и text(); взят из документации req.body).
Edit2 Спасибо AP. Я помещал операторы использования перед любыми определениями маршрутов, например так:
// Create Express object, enable CORS
var app = express()
app.use(bodyParser.json())
app.use(cors())
// Route definitions
app.post('/backend_test', function(req, res){
res.json(req.body)
console.log(req.body)
})
app.listen(9090, function() {
console.log('App started, listening on port 9090')
})
Я также обновил свой элемент iron-ajax для явного создания сообщения, а не получения, и установил тип содержимого как json, но без кубиков. Я все еще получаю только {}
с другой стороны:
<iron-ajax
id='test-req'
url='http://localhost:9090/backend_test'
content-type="json"
method="post"
handle-as='json'
on-response='testRsp'
body='{"data":"stuff"}'>
</iron-ajax>
Edit3 Я нашел ошибку с моим обновлением, тип контента должен быть application/json
, не просто json
, Это наконец заработало. Спасибо!
1 ответ
Ваше промежуточное программное обеспечение должно быть инициализировано перед вашими маршрутами и должно выглядеть примерно так:
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
С точки зрения реализации полимера, если вы отправляете JSON
данные, согласно документам, ваш элемент также должен содержать:
<iron-ajax content-type='json'>
Существует также демо-репозиторий, который показывает пример сервера стека MEAN, на котором запущен полимер в качестве внешнего интерфейса. Что, по моему мнению, также связано с вашим вопросом?
PS. Youtube-Black - более полный пример.
Редактировать:
Я только что понял, что ты скучаешь по method
атрибут вашего элемента Polymer. Без этого вы отправляете GET
запрос! Убедитесь, что вы используете свой элемент так же, как и другие реквизиты:
<iron-ajax content-type='json' method='post'>