Polymer:向NodeJS后端发出JSON ajax请求

时间:2017-01-31 22:23:31

标签: javascript json node.js express polymer

我尝试使用NodeJS作为Polymer前端的后端api进行测试。在聚合物方面,我有这个铁 - 阿贾克斯元素:

<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)
}

正如您所看到的,它只是响应原始请求,并在后端记录请求。双方的预期结果相同,但遗憾的是结果只是{}

现在,我也尝试通过params属性发送json而不是iron-ajax元素的body属性,在后端我使用了弃用的req.param()函数,如下所示:req.param('data') ,并在浏览器和后端正确打印出stuff。但是,由于它已被弃用,我试图避免使用该方法。

有什么建议吗?

编辑:我认为这条额外的信息会有所帮助。当我在{&#39; params&#39;中传递json时在后端记录req.originalUrl时,我得到/backend-test?data=stuff。当传入&#39; body&#39;时,它只是/backend-test

我还想注意,我也尝试过bodyParser中间件的各种变体:

- &gt; app.use(bodyParser.json())(结果如上所述)

- &gt; app.use(bodyParser.text())(相同)

- &gt;根本不使用bodyParser(根据明确的文档按预期打印undefined

- &gt; app.use(bodyParser.text()); app.use(bodyParser.urlencoded({ extended: true }));(与json()和text()相同的输出;取自req.body docs)。

Edit2 谢谢AP。我一直在任何路由定义之前放置use语句,如下所示:

// 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元素以明确地发布帖子而不是get,并将内容类型设置为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 个答案:

答案 0 :(得分:0)

您的中间件应该在路由之前初始化,并且应该有点类似于:

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数据,则根据docs您的元素还应包含:

<iron-ajax content-type='json'>

还有一个demo-repository显示了一个运行聚合物的示例MEAN堆栈服务器,因为它是前端。我认为哪个也与你的问题有关?

PS。 Youtube-Black是一个更全面的例子。

编辑:

我刚刚意识到你错过了Polymer元素的method属性。没有它,您正在发送GET请求!除了你的其他道具之外,一定要使用你的元素:

<iron-ajax content-type='json' method='post'>