我尝试使用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
。最终让它发挥作用。谢谢!
答案 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'>