我正在学习node.js,下面是我的代码
app.js:
const forecastService = require('./forecast')
forecastService('New York', (error,data) => {
if(error){
console.log('Error in getWeatherForecast ')
}else {
console.log('data '+data)
}
})
forecast.js:
const request = require('request')
const getWeatherForecast = (city,callback) => {
console.log('printing typeof callback ..'+typeof callback)
// prints function
console.log('printing callback ..'+callback)
//prints actual function definition
const api = 'http://api.weatherstack.com/current?access_key=abcdefghijklmn'
const weather_url = api + '&request='+city
request({url:weather_url, json:true} , (error,response,callback) => {
if(error){
callback('unable to connect to weather service',undefined)
}else (response.body.error){
const errMessage = 'Error in Response :'+response.body.error.info
console.log(errMessage)
callback(errMessage,undefined) // getting error here
}
})
}
module.exports = getWeatherForecast
问题:
在forecast.js
中,在第callback(errMessage,undefined)
行,我遇到了错误-TypeError: callback is not a function
我还在Forecast.js中将回调打印为typeof callback = function和callback = actul function definition
但是我仍然不知道这是什么错误。
有人可以帮忙吗?
我经历了像TypeError : callback is not a function这样的公开帖子,所有这些都说回调没有作为参数正确传递,这似乎对我来说不是这种情况
问题是您的请求回调定义错误。根据docs
回调参数获得3个参数:
- 适用时出错(通常来自http.ClientRequest对象)
- http.IncomingMessage对象(响应对象)
- 第三是 响应正文(字符串或缓冲区,或JSON对象(如果json选项为 提供)
因此很明显,第三个参数不是函数,实际上,您是外部范围的shadowing回调。您只需删除第三个参数即可解决此问题:
request({url:weather_url, json:true} , (error,response) => {
if(error){
callback('unable to connect to weather service',undefined)
}else (response.body.error){
const errMessage = 'Error in Response :'+response.body.error.info
console.log(errMessage)
callback(errMessage,undefined) // getting error here
}
})
一个建议-您应该使用Promises和/或async / await而不是回调,因为它会大大提高代码的可读性和流程。