在快速中间件中调用时,这在原型函数中不起作用

时间:2018-05-06 10:46:30

标签: javascript node.js express this prototype

我在node.js表达框架中遇到一个奇怪的错误。

我创建了一个文件说 test.js ,其中包含以下代码

import axios from 'axios'
import store from './store'

const instance = axios.create({
  baseURL: window.location.origin + '/api',
  timeout: 10000,
  params: {}
});

if (!store.state.synced)
  axios.interceptors.request.use(config => {
    const token = localStorage.getItem('token') || sessionStorage.getItem('token');
    token
      ? config.headers.Authorization = 'Bearer ' + token
      : store.dispatch('setUserToDefault');
    return config;
  }, error => Promise.reject(error));

instance.interceptors.request.use(async config => {
  const token = localStorage.getItem('token') || sessionStorage.getItem('token');
  token
    ? config.headers.Authorization = 'Bearer ' + token
    : store.dispatch('setUserToDefault');
  if (!store.state.synced && token)
    await axios
      .post(window.location.origin + '/api/user/sync')
      .then(response => {
        store.dispatch('setSettings', response.data.settings);
        store.dispatch('setSynced', true);
      });
  return config;
}, error => Promise.reject(error));

export default instance

和另一个文件 call_test.js

function a(){

}

a.prototype.b = function(){
    this.c("asdsad");
}

a.prototype.c = function(string){
    console.log("ccc"+string)
}

/*var ob = new a();
ob.b();*/

module.exports = a;

当我运行节点call_test.js时,它正在给我正确的输出cccasdsad

但是,当我使用文件 express_test.js

中的快速中间件调用test.js时
var test = require('./test');
var test_ob = new test();
test_ob.b();

我收到错误。当我遇到testAPI时,this.c不是一个函数。

您能否告诉我为什么 在中间件中使用时无效。

1 个答案:

答案 0 :(得分:0)

app.get行的调用上下文为app,因此当b函数尝试运行this.c("asdsad");时,它会尝试访问app.c实际上是在尝试访问test_ob.c

b函数传递给app.get时,b函数的this绑定到test_ob,这样它就会正确引用:

app.get('/testAPI',test_ob.b.bind(test_ob));