NodeJs : TypeError : require (…)는 함수가 아닙니다.


89

나는 파일을 요구하고 나중에 그것을 var에 전달하려고합니다. 나는 다음과 같은 오전 인증 시스템을 만들 수있는 튜토리얼. server.js 파일을 작성하고 컴파일을 시도한 후 bson 오류가 발생하여 mongoose에서 릴리스 버전이 필요한 행을 변경했습니다.

내 코드와 오류는 다음과 같습니다.

server.js

    require('./app/routes')(app, passport);

오류

require('./app/routes')(app, passport);
                   ^

TypeError: require(...) is not a function
           at Object.<anonymous> (d:\Node JS learning\WorkWarV2\server.js:38:24)
           at Module._compile (module.js:434:26)
           at Object.Module._extensions..js (module.js:452:10)
           at Module.load (module.js:355:32)
           at Function.Module._load (module.js:310:12)
           at Function.Module.runMain (module.js:475:10)
           at startup (node.js:117:18)
           at node.js:951:3

Process finished with exit code 1

나는 이것이 일반적으로 requireJS가 제대로로드되지 않는다는 것을 의미하지만 왜 또는 어떻게 고치는 지 알지 못한다는 것을 읽었습니다.

댓글로 인해 수정 :

질문에 따르면 다음console.log(require);


console.log(require)실패한 선 앞에서 할 수 있습니까 ? 서버 측에는 requireJS가 필요하지 않습니다. node.js에는 모듈 시스템이 내장되어 있습니다 (CommonJS, require함수 도 사용 ). 뭔가 전역 require변수를 변경하는 것 같습니다 .
kraf

답변:


107

나는 이것이 module.exports당신의 ./app/routes모듈에서 함수로 할당 require('./app/routes')되지 않았 으므로 함수로 해결되지 않으므로 이와 같은 함수로 호출 할 수 없다는 것을 의미한다고 생각 합니다 require('./app/routes')(app, passport).

우리 ./app/routes가 그것에 대해 더 언급하기를 원한다면 우리에게 보여주십시오 .

다음과 같이 보일 것입니다.

module.exports = function(app, passport) {
    // code here
}

다음과 같이 호출 할 수있는 함수를 내보내고 있습니다 require('./app/routes')(app, passport).


유사한 오류가 발생할 수있는 또 다른 이유는 모듈 A가 시도 require(B)하고 모듈 B가 시도 하는 순환 모듈 종속성이있는 경우 require(A)입니다. 이런 일이 발생하면 require()하위 시스템에 의해 감지되고 그중 하나가로 돌아 null오므로이를 함수로 호출하려고하면 작동하지 않습니다. 이 경우 수정 사항은 일반적으로 공통 코드를 세 번째 모듈로 분할하여 순환 종속성을 제거하는 것입니다. 일반적으로 순환 종속성을 수정하는 세부 사항은 각 상황에 고유하지만 둘 다 개별적으로로드 할 수 있습니다.


또는 :module.exports.functionName = function functionName(app, passport) { ... }
Magne

@Magne-그러나 OP는 require('./app/routes')(app, passport);내보내기를 표시하는 방식으로 작동하지 않는 작업을 시도하고 있습니다.
jfriend00

사실, 내 잘못이야. 내 사용 사례는 약간 달랐습니다. 명명 된 함수를 내보내고 싶었습니다.
Magne

67

나는 즉시 기능을 호출 할 때 나를 위해, 나는 둘 필요가 ;의 끝에서 require().

오류:

const fs = require('fs')

(() => {
  console.log('wow')
})()

좋은:

const fs = require('fs');

(() => {
  console.log('wow')
})()

7
이것은 또한 내 문제였습니다! 문제는이 경우 런타임이 공백을 무시한다는 것이므로 .NET에서 () => {}반환되는 모든 항목에 대한 인수로 함수 본문 을 전달하는 것 같습니다 require( ... ). 무서운!
윌 Brickner

예, 이것은 'JS의 세미콜론'논쟁에서 세미콜론을 선호하는 좋은 주장입니다. 다행히도 세미콜론의 부재는 유행에서 벗어난 IIFE의 맥락에서만 문제가되는 것 같습니다
JP Lew

1
세상에!! 나는 여기에서 왔고 puppeteer여기서 문제를 찾을 때까지 거의 요청했습니다. 휴 .. ;그게 나에게 큰 문제 가 될 줄은 몰랐어요 .
Irfandy Jip

1
훌륭한 솔루션! 실제로 모든 자체 호출 함수 앞에 세미콜론을 넣어야합니다. 나는이 구조를 개조했다 :;(() => {})()
Dmitry

코드가 라이브러리 내에있는 경우 어떤 옵션이 있습니까? 세미콜론을 전혀 사용하지 않는 node_modules 라이브러리 (node-mailjet)가 있습니다. 나는 로컬 웹팩 확인으로 구축 할 수 있습니다하지만 난 도커에 빌드 할 때 다음이 오류 :( 얻을
하비에르 구즈만


0

나에게는 분기간에 전환 할 때 비슷한 오류가 발생 @google-cloud/datastore했습니다. 하나는 내 보낸 객체의 속성 중 하나로 Datastore 생성자를 사용하여 객체를 반환 하는 최신 ( "typescriptish") 버전의 패키지를 사용하고 작업을 위해 다른 분기 인 이전 데이터 저장소 버전으로 전환했습니다. 데이터 저장소 생성자를 module.exports값으로 '직접'내보내는 데 사용되었습니다 . node_modules에 내가 전환 한 지점에서 사용하는 최신 모듈이 여전히 있기 때문에 오류가 발생했습니다.


0

저도 이런 일에 직면했습니다. 경로 파일에서 다음과 같은 객체로 함수를 내 보냅니다.

 module.exports = {
     hbd: handlebar
 }

그리고 앱 파일에서 .hbd로 함수에 액세스 할 수 있으며 ptoblem이 없습니다 ....!


-1

당신을 수출하는 것을 잊지 마십시오 routes.js.

에서 routes.js, 당신의 경로와이 기능 모듈의 모든 코드를 작성 :

exports = function(app, passport) {

/* write here your code */ 

}

-1

파일이 필요한 곳에 Arrow 기능으로 감싸십시오.


5
당신이 말한 것을 수행하는 방법에 대한 코드를 우리에게 보여 주면 좋을 것입니다
U11-Forward
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.