我是回调函数的新手。实际上我在节点js中使用请求模块来获取一些信息。我很困惑如何返回我的响应,因为Javascript本质上是异步的。我有以下代码。
我的app.js
代码如下:
var express = require('express');
var app = express();
const request = require('request');
var call = require('./method');
app.use(express.json());
app.post('/call', function(request, response){
var json = request.body;
var p1 = json.p1;
var p2 = json.p2;
var p3 = json.p3;
var p4 = json.p4;
call.callApi(p1, p2, p3, p4);
//response.send(request.body);
});
app.listen(3000);
我的函数文件名为method.js,如下所示:
const request = require('request');
function callApi(p1, p2, p3, p4, callback) {
var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
console.log(api);
request(api, function(err, res, body) {
var result = body;
return callback(result, false);
//console.log(body);
//return result;
});
}
module.exports = {
callApi: callApi,
};
我通过在body中发送json数据来请求POST请求,如下所示:
{ "p1":"28.7033129", "p2":"77.1542682", "p3":"28.709637", "p4":"77.291254" }
我正在得到正确的结果,但我想要回复,请在我出错的地方纠正我。
答案 0 :(得分:3)
就像任何其他回调一样。在您的代码中,您没有为callback
参数传递任何内容。如果您这样做并使用其参数,则可以编写响应。没有在post
回调期间同步写响应(正常和完全正常)。
E.g:
app.post('/call', function(request, response){
var json = request.body;
var p1 = json.p1;
var p2 = json.p2;
var p3 = json.p3;
var p4 = json.p4;
call.callApi(p1, p2, p3, p4, function(result) { // ***
response.send(result); // ***
}); // ***
});
那就是说,你应该改变你的回调以匹配标准的Node回调样式(或者采用promises,这会更好):让它传递错误或null
作为第一个参数和结果(如果有的话)作为第二个。 E.g:
function callApi(p1, p2, p3, p4, callback) {
var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
console.log(api);
request(api, function(err, res, body) {
return callback(err, body); // ***
});
}
然后
app.post('/call', function(request, response){
var json = request.body;
var p1 = json.p1;
var p2 = json.p2;
var p3 = json.p3;
var p4 = json.p4;
call.callApi(p1, p2, p3, p4, function(err, result) { // ***
if (err) { // ***
// Send error response // ***
// ... // ***
} else { // ***
// Send successful response // ***
response.send(result); // ***
} // ***
});
});
答案 1 :(得分:2)
你需要传递回调函数,因为你在callApi中调用回调函数,但你没有将任何回调传递给callApi.But总是记得将err作为回调函数中的第一个参数。
示例:
app.post('/call', function(request, response){
var json = request.body;
var p1 = json.p1;
var p2 = json.p2;
var p3 = json.p3;
var p4 = json.p4;
call.callApi(p1, p2, p3, p4, function(err,result) {
if(!err)
response.send(result);
else {
// do something
}
});
});
你的callApi函数应该是这样的:
enter codfunction callApi(p1, p2, p3, p4, callback) {
var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
console.log(api);
request(api, function(err, res, body) {
var result = body;
//console.log(body);
if(!err)
callback(null,result);
else {
callback(err);
}
});
}