代码之家  ›  专栏  ›  技术社区  ›  adam tropp

如何将三个参数传递给express/node arrow函数?

  •  0
  • adam tropp  · 技术社区  · 6 年前

    我这样声明我的函数:

    const parseConnections = (connectionsCSVPath, req, res) => { 
         //do a bunch of stuff 
    } 
    

    在函数内部,如果我尝试调用res.locals.something,我会得到一个错误,说“无法读取未定义的属性局部变量”,我尝试了其他几种语法,例如:

    const parseConnections = ((connectionsCSVPath, req, res) => { 
         //do a bunch of stuff 
    }) 
    

    这是:

    const parseConnections = (connectionsCSVPath, (req, res) => { 
         //do a bunch of stuff 
    }) 
    

    而这:

    const parseConnections = connectionsCSVPath, (req, res) => { 
         //do a bunch of stuff 
    } 
    

    他们都会犯错。将这3个参数传递给函数以便在函数内部定义所有3个参数的正确方法是什么?

    edit*:然后按如下方式调用函数:

    router.post(
    '/upload/engagements/batch', checkIfAuthenticated,
    parseConnections('./tmp/connections.csv'), 
    parseMessages('./tmp/messages.csv'), (req, res) => { 
        //do a bunch of stuff 
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Felix Kling    6 年前

    问题不在于你如何定义函数,而在于你如何使用它。

    parseConnections('./tmp/connections.csv') 调用函数。你只是在向它传递一个论点,所以 req res undefined .

    function foo(a, b, c) {
      console.log('a:', a);
      console.log('b:', b);
      console.log('c:', c);
    }
    
    foo('first argument');

    然而, 无法传递的值 情商 物件 因为这些值是由表达式本身创建和传递的。

    实际上你犯了一个错误 打电话 你应该去的地方 经过 它。 router.post expects to be passed one or more functions . 但你是 打电话 parseConnections 而传递它的返回值 未定义 .

    下面是一个简单的例子,说明了不同之处:

    function foo(x) {
      console.log('inside foo', 'x is ', x);
    }
    
    // bar expects to be passed a function that it can call
    function bar(callback) {
      console.log('bar received:', callback);
      try {
        callback(42);
      } catch(e) {
        console.error(e);
      }
    }
    
    
    // this will work as expected
    console.log('Passing a function');
    bar(foo); 
    
    // this will error because `bar` doesn't receive a function.
    // this is what you are doing
    console.log('Calling a function and passing its return value');
    bar(foo(21));

    解决问题的方法之一是 分析连接 返回函数 ,然后由接收 邮递员 . 我在这里使用的是普通函数声明,这样语法就不会太混乱:

    function parseConnections(connectionsCSVPath) {
      return function(req, res) {
         //do a bunch of stuff 
      };
    } 
    

    这不需要更改 邮递员 打电话。


    另一种解决方案是将函数传递给 邮递员 那个电话 分析连接 相反地,传下去 情商 物件 :

    router.post(
      '/upload/engagements/batch',
      checkIfAuthenticated,
      (req, res) => parseConnections('./tmp/connections.csv', req, res),
      // alternatively you can use `.bind`:
      // parseConnections.bind(null, './tmp/connections.csv'),
      parseMessages('./tmp/messages.csv'), // <- this is likely wrong as well,
                                           // but I leave this to you to figure out
      (req, res) => { 
        //do a bunch of stuff 
      }
    );