TL / DR:使用强调命名约定服务器端(RoR)和基于camelCased命名约定clientide(JS)
的好方法像Ruby on Rails这样的服务器端编程环境使用了下划线变量。通常,JavaScript使用camelCased变量。将数据从客户端发送到服务器时会出现问题。
例如,考虑将用户信息发送给客户端。数据库中可能有一个名为num_times_ordered的属性,但在JavaScript中,您传统上希望将其称为numTimesOrdered。
有没有人想出一个优雅的方式来解决这个问题?以下是一些选项,没有一个特别好:
我倾向于#3,并在我的JavaScript中使用下划线。但是,当我使用基于camelCased的第三方库时,它看起来很奇怪。
答案 0 :(得分:5)
我相信ember.js(通过Ember Data)采用方法#1:在获取时将强调的JSON转换为客户端的camelCase;并且在回发到服务器之前做反向。
我一直在开发一个执行这些转换的小型库:https://github.com/domchristie/humps,允许您执行以下操作:
// GET
$.ajax({
url: '/posts',
dataType: 'json',
success: function(data, status, xhr) {
data = humps.camelizeKeys(data);
}
});
// POST
$.ajax({
type: 'POST',
url: '/posts'
dataType: 'json',
data: humps.decamelizeKeys({
title: "Foo",
publishedAt: "2012-09-03T21:35:46.068Z"
})
});
// Sends: { title: "Foo", published_at: "2012-09-03T21:35:46.068Z" }
我应该补充一点,它还没有经过重点测试,但欢迎贡献!
答案 1 :(得分:1)
恢复这种方式以获得更现代的方法。
的一个很好的用例基本上,定义一个客户端类并附加一个转换请求/响应数据的前/后拦截器。
export default class Client {
get(url, data, successCB, catchCB) {
return this._perform('get', url, data, successCB, catchCB);
}
post(url, data, successCB, catchCB) {
return this._perform('post', url, data, successCB, catchCB);
}
_perform(method, url, data, successCB, catchCB) {
// https://github.com/axios/axios#interceptors
// Add a response interceptor
axios.interceptors.response.use((response) => {
response.data = toCamelCase(response.data);
return response;
}, (error) => {
error.data = toCamelCase(error.data);
return Promise.reject(error);
});
// Add a request interceptor
axios.interceptors.request.use((config) => {
config.data = toSnakeCase(config.data);
return config;
}, (error) => {
return Promise.reject(error);
});
return axios({
method: method,
url: API_URL + url,
data: data,
headers: {
'Content-Type': 'application/json',
},
}).then(successCB).catch(catchCB)
}
}
这是一个使用React / axios的较长示例的gist。