You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何在then函数内调用同文件中的其他函数?

解决Cannot read property 'getLatLng' of undefined的问题

这个错误的核心原因是回调函数里的this指向不对。在then()的普通函数回调里,this并不会指向你的模块导出对象(也就是exports),所以调用this.getLatLng自然会拿到undefined。下面给你几种可行的修复方案,还顺便优化下代码里的小问题:

方案1:用箭头函数继承外部this

箭头函数不会绑定自己的this,它会沿用外层函数(也就是correctDataWOLatLng)的this指向,这样就能正常调用getLatLng了:

exports.getLatLng = function(attractionId, attractionName){ 
  // 这里要返回promise,否则调用方没法处理异步结果
  return googleMapsClient.geocode({address: attractionName}).asPromise()
  .then((response) => { 
    const tmp = response.json.results; // 声明变量,避免全局污染
    return tmp; 
  })
  .catch((err) => { 
    console.log(err); 
    // 抛出错误让调用方可以处理
    throw err;
  }); 
}

exports.correctDataWOLatLng = function(){ 
  model.getMySQLDataWOLatLng().then((result) => { // 改成箭头函数
    console.log(result);
    this.getLatLng(0, "lalbagh bangalore"); 
  }); 
};

方案2:提前保存this到变量里

如果习惯用普通函数回调,可以在correctDataWOLatLng开头把this存到一个变量(比如self)里,后续用这个变量调用方法:

exports.getLatLng = function(attractionId, attractionName){ 
  return googleMapsClient.geocode({address: attractionName}).asPromise()
  .then((response) => { 
    const tmp = response.json.results;
    return tmp; 
  })
  .catch((err) => { 
    console.log(err);
    throw err;
  }); 
}

exports.correctDataWOLatLng = function(){ 
  const self = this; // 保存外部的this
  model.getMySQLDataWOLatLng().then(function(result) { 
    console.log(result);
    self.getLatLng(0, "lalbagh bangalore"); // 用self代替this
  }); 
};

方案3:直接调用exports.getLatLng

因为getLatLng本身就是挂载在exports上的,直接用exports.getLatLng调用最直接,完全不用纠结this指向:

exports.getLatLng = function(attractionId, attractionName){ 
  return googleMapsClient.geocode({address: attractionName}).asPromise()
  .then((response) => { 
    const tmp = response.json.results;
    return tmp; 
  })
  .catch((err) => { 
    console.log(err);
    throw err;
  }); 
}

exports.correctDataWOLatLng = function(){ 
  model.getMySQLDataWOLatLng().then(function(result) { 
    console.log(result);
    exports.getLatLng(0, "lalbagh bangalore"); // 直接调用exports上的方法
  }); 
};

另外还要注意:原代码里的tmp没有用let/const声明,会变成全局变量,这是个不好的习惯,记得加上变量声明。还有getLatLng函数里要返回promise,不然你调用它的时候没法用.then()处理返回的地理编码结果,我在上面的修复代码里已经加上了返回语句和错误抛出,这样调用方可以更好地处理异步流程。

内容的提问来源于stack exchange,提问作者Akash Prasanna Basabhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:21