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'>
Другие вопросы по тегам