本地Ajax调用不提供响应文本

时间:2016-07-25 04:58:33

标签: javascript jquery ajax npm

我正在尝试使用有关输入参数的数据从客户端向我的服务器发送ajax调用。当我尝试这个时,我只能在服务器控制台中看到数据,而不是在浏览器中看到。

客户端是ajax调用,将“Peter_Abelard”设置为演示标题。此调用为我提供了200 ok状态,但响应文本为空。

 $.ajax({
    type: "GET",
    url: 'http://localhost:3000/api/wiki/Peter_Abelard',
    async: false,
    datatype: 'json',
    success: function(response){
      console.log(response);
    }
  });

在我有的服务器代码中

function getData(name){
 wikipedia.page.data(name, { content: true }, function(response) {
  console.log(JSON.stringify(response));

  var dad = JSON.stringify(response);

  fs.writeFile("wikip.txt", dad, function(err) {
    if (err) throw err;
    console.log('It\'s saved!');
  });

  return dad;
});
}

app.get('/api/wiki/:que', function(req, res) {
  var queryd = req.params.que;
  getData(queryd);
  res.send(getData(queryd));
});

我相信这个问题与行res.send(getData(queryd))有关,但我不知道该尝试什么。如果我是正确的,这一行应该将正确的文本发送给客户。

1 个答案:

答案 0 :(得分:2)

您当前的方法存在一些问题:

  1. 实际的getData()函数没有返回值。这就是为什么你总是得到undefined的原因。你是从一个内部回调中回来的,但那并没有做任何事情。

  2. 您的结果是异步的,因此无法从getData()返回,因为getData()返回时结果甚至都不知道。异步响应意味着您的Javascript继续运行(因此getData()空出来后返回)并且稍后会调用异步回调。

  3. 为了使这项工作,getData()需要接受一个回调,它可以在数据可用时调用,或者需要返回一个promise,然后调用者需要适当地使用该回调或承诺获取数据。

  4. 要使其工作,您必须知道如何在node.js中处理异步操作。我建议这样做:

    function getData(name, cb) {
        wikipedia.page.data(name, {content: true}, function (response) {
            console.log(response);
    
            cb(null, response);
    
            // I'm not sure why you're writing this here
            fs.writeFile("wikip.txt", dad, function (err) {
                if (err) throw err;
                console.log('It\'s saved!');
            });
        });
    }
    
    app.get('/api/wiki/:que', function (req, res) {
        var queryd = req.params.que;
        getData(queryd, function (err, data) {
            if (err) {
                // send error response here
            } else {
                res.json(data);
            }
        });
    });
    

    P.S。对我来说,wikipedia.page.data()具有异步回调响应,但没有错误报告机制,这看起来很奇怪。

    通过阅读以下答案,您可以了解有关在node.js中处理异步操作的更多信息:How do I return a response from an asynchronous operation