【问题标题】:Creating routes for Ajax calls in NodeJs在 NodeJs 中为 Ajax 调用创建路由
【发布时间】:2017-11-23 17:59:45
【问题描述】:

假设我的渲染 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 调用的路由呢?

【问题讨论】:

  • ajax 输出和页面渲染有什么区别?不太清楚你想在这里完成什么
  • user 仍然是 null 所以我认为我的 Ajax 调用是错误的

标签: javascript jquery node.js ajax express


【解决方案1】:

编辑:首先,您需要修复客户端 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 格式的配置文件信息。

就个人而言,我更喜欢第一个选项,因为它使意图更加清晰。

【讨论】:

  • 抱歉,您介意指定第一种方式吗?我是一个完全的初学者......
  • 当然!当我大约一个小时左右回到家时,我将扩展选项 1。同时,请参阅我关于客户端 JS 中的错误的说明
  • 如果您对有效路由进行 Ajax 调用,则对客户端 JS 进行修复将正确打印 user.name
  • 我刚刚修复了 Ajax 回调。但是,在调用中请求变量时,我什么时候可以使用它们?我将一个局部变量分配给user.name,它仍然是未定义的,但在回调中它不是
  • 您将在第 7 行之后直接调用 increaseValue,这在您的 done() 回调中。此外,您可能希望将第 11 行移至第 2 行之前,以便在使用之前声明变量。
猜你喜欢
  • 2019-06-01
  • 2021-08-16
  • 2022-01-04
  • 1970-01-01
  • 2016-05-26
  • 2019-05-07
  • 1970-01-01
  • 2015-07-13
  • 2017-10-08
相关资源
最近更新 更多