我正在尝试使用有关输入参数的数据从客户端向我的服务器发送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))
有关,但我不知道该尝试什么。如果我是正确的,这一行应该将正确的文本发送给客户。
答案 0 :(得分:2)
您当前的方法存在一些问题:
实际的getData()
函数没有返回值。这就是为什么你总是得到undefined
的原因。你是从一个内部回调中回来的,但那并没有做任何事情。
您的结果是异步的,因此无法从getData()
返回,因为getData()
返回时结果甚至都不知道。异步响应意味着您的Javascript继续运行(因此getData()
空出来后返回)并且稍后会调用异步回调。
为了使这项工作,getData()
需要接受一个回调,它可以在数据可用时调用,或者需要返回一个promise,然后调用者需要适当地使用该回调或承诺获取数据。
要使其工作,您必须知道如何在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。