问题不在于你如何定义函数,而在于你如何使用它。
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
}
);