NodeJs: TypeError: require (…) ไม่ใช่ฟังก์ชัน


88

ฉันพยายามต้องการไฟล์และส่งต่อไปยังไฟล์ var. ฉันกำลังทำตามบทช่วยสอนนี้เพื่อสร้างระบบการตรวจสอบสิทธิ์ หลังจากเขียนไฟล์ server.js และพยายามคอมไพล์ฉันพบข้อผิดพลาด bson ดังนั้นฉันจึงเปลี่ยนบรรทัดที่ต้องใช้เวอร์ชันรีลีสเป็นพังพอน

นี่คือรหัสและข้อผิดพลาดของฉัน:

เซิร์ฟเวอร์ 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)คุณกำลังส่งออกฟังก์ชั่นที่สามารถแล้วจะเรียกว่าเหมือน


เหตุผลหนึ่งที่อื่น ๆ ที่คล้ายกันข้อผิดพลาดที่อาจเกิดขึ้นคือถ้าคุณมีการพึ่งพาโมดูลวงกลมที่โมดูลจะพยายามที่จะ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
นี่ก็เป็นปัญหาของฉันเช่นกัน! ปัญหาจริงๆก็คือการละเว้นรันไทม์ช่องว่างในกรณีนี้และดังนั้นจึงดูเหมือนว่าคุณผ่านการทำงานของร่างกายของคุณเป็นอาร์กิวเมนต์เพื่อสิ่งที่ถูกส่งกลับโดย() => {} require( ... )แย่มาก!
Will Brickner

ใช่นี่เป็นข้อโต้แย้งที่ดีในการสนับสนุนอัฒภาคในการอภิปราย 'อัฒภาคใน JS' โชคดีที่การไม่มีอัฒภาคดูเหมือนจะเป็นปัญหาเฉพาะในบริบทของ IIFE ซึ่งกำลังตกไปจากแฟชั่น
JP Lew

1
โอ้พระเจ้า!! ฉันมาจากpuppeteerที่นั่นและเกือบจะขอปัญหาที่นั่นจนกระทั่งฉันพบปัญหาที่นี่ ฟิ้ว ... ไม่เคยคิดว่า;จะเดือดร้อนขนาดนี้
Irfandy Jip

1
ทางออกที่ดี! โปรดทราบว่าคุณควรใส่เครื่องหมายอัฒภาคก่อนฟังก์ชันเรียกใช้ตัวเองทุกครั้ง ฉันปรับโครงสร้างนี้:;(() => {})()
Dmitry

มีตัวเลือกอะไรบ้างหากรหัสอยู่ในไลบรารี ฉันมีไลบรารี node_modules (node-mailjet) ซึ่งไม่ใช้อัฒภาคเลย ฉันสามารถสร้างด้วย Webpack ได้ในเครื่อง แต่เมื่อฉันสร้างบน Docker มันจะได้รับข้อผิดพลาดนี้ :(
Javier Guzmán

14

สำหรับฉันนี่เป็นปัญหาเกี่ยวกับการอ้างอิงแบบวนรอบ

IOW, โมดูล A โมดูลที่ต้องการ B และโมดูล B ที่จำเป็นโมดูล A

ดังนั้นในโมดูล B require('./A')เป็นวัตถุว่างเปล่าแทนที่จะเป็นฟังก์ชัน

วิธีจัดการกับการอ้างอิงแบบวนใน Node.js


0

สำหรับฉันฉันพบข้อผิดพลาดที่คล้ายกันเมื่อสลับไปมาระหว่างสาขา - เวอร์ชันหนึ่งใช้@google-cloud/datastoreแพ็กเกจรุ่นใหม่กว่า ("typescriptish") ซึ่งส่งคืนอ็อบเจ็กต์ที่มีตัวสร้าง Datastore เป็นหนึ่งในคุณสมบัติของอ็อบเจ็กต์ที่ส่งออกและฉันเปลี่ยนไปใช้สาขาอื่นสำหรับงานซึ่งเป็นเวอร์ชันพื้นที่เก็บข้อมูลที่เก่ากว่า ถูกใช้ที่นั่นซึ่งส่งออกตัวสร้าง Datastore "โดยตรง" เป็นmodule.exportsค่า ฉันได้รับข้อผิดพลาดเนื่องจาก node_modules ยังมีโมดูลที่ใหม่กว่าที่ใช้โดยสาขาที่ฉันเปลี่ยนจาก


0

ฉันเคยเผชิญกับเรื่องแบบนี้เช่นกัน ในไฟล์เส้นทางของคุณส่งออกฟังก์ชันเป็นวัตถุเช่นนี้:

 module.exports = {
     hbd: handlebar
 }

และในไฟล์แอพของคุณคุณสามารถเข้าถึงฟังก์ชั่นโดย. hbd และไม่มีปัญหา .... !


-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.