假设我有这条路线用于渲染html:
app.get('/profile/:id', function (req, res) { // my route
res.render('profile', { id: Number(req.params.id) }); // render the file and set a variable
});
,在我的客户端JavaScript文件中,我想从服务器获取数据。通过将用户ID发送到服务器,服务器返回用户对象,我请求数据时请求数据:
$(document).ready(function() {
var user = null;
$.ajax({
type: 'GET',
url: '', // This one is missing here
dataType: 'json'
}).done(function(data){
user = JSON.stringify(data);
});
console.log(user.name);
});
我的服务器将处理此功能:
app.get('', function (req, res) { // missing route
var userId = ; // This is missing
var userObj = getUserById(userId);
res.send(userObj);
});
我必须使用什么路线?教程说我必须像/profile/:id
一样通过路线,但是这条路线已经存在?
我尝试定义一条新路线,例如:
app.get('/reqUser/:id', function (req, res) { // Ajax route
res.send(getUserById(Number(req.params.id)));
});
对于我的ajax呼叫,我通过url http://localhost:8888/reqUser/12345
传递,但这似乎是错误的,因为使用AJAX调用后用户仍然为无效。
那么如何定义处理页面和ajax调用的路线?
edit:首先,您需要在客户端JS中修复错误,然后在获取user
之前尝试打印user.name
从服务器。您可以通过将console.log
语句移至done()
回调中来解决此问题:
$(document).ready(function() {
var user = null;
$.ajax({
type: 'GET',
url: '', // This one is missing here
dataType: 'json'
}).done(function(data){
user = JSON.stringify(data);
console.log(user.name); // log here
});
});
关于您的路线问题,您有几个选择。以下是解决此问题的两个常见解决方案:
- 创建一个单独的
api
路由,以将您的API请求与页面请求区分开。例如,app.get('/api/profile/:id, (req, res) => {...});'
- 在您的AJAX调用中添加一个URL参数,以指定您想要响应的格式,默认值为页面的HTML。例如,您的Ajax会向URL
/profile/2012?format=json
发送GET请求,该请求将在JSON中返回配置文件的信息。
就个人而言,我更喜欢第一个选项,因为它使意图更加清楚。