node callbacks take an error as the first argument