NodeJs: TypeError: required (…) bir işlev değil


88

Bir dosya gerektirmeye çalışıyorum ve daha sonra onu bir var. Bir kimlik doğrulama sistemi oluşturmak için bu öğreticiyi takip ediyorum . Server.js dosyasını yazıp derlemeye çalıştıktan sonra bir bson hatası aldım bu yüzden mongoose'da yayın sürümünü gerektiren satırı değiştirdim.

İşte kodum ve hatam:

server.js

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

Hata

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

Bunun genellikle requireJS'nin düzgün yüklenmediği anlamına geldiğini okudum, ancak neden veya nasıl düzelteceğimi bilmiyorum.

Yorum nedeniyle düzenleyin:

Sorulduğu gibi, işte sonucuconsole.log(require);


console.log(require)Başarısız olan çizgiden önce yapabilir misin ? Sunucu tarafında requireJS'ye ihtiyacınız olmamalıdır, node.js yerleşik bir modül sistemine sahiptir (CommonJS, ayrıca requireişlevi kullanır ). Küresel requiredeğişkeni bir şey değiştiriyor gibi görünüyor .
kraf

Yanıtlar:


107

Sanırım bu module.exports, ./app/routesmodülünüzde bir işlev olarak atanmadığı ve bu nedenle require('./app/routes')bir işleve çözümlenmediği anlamına gelir, bu nedenle onu böyle bir işlev olarak adlandıramazsınız require('./app/routes')(app, passport).

Bu ./app/routeskonuda daha fazla yorum yapmamızı istiyorsanız bize gösterin .

Bunun gibi bir şeye benzemeli;

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

Daha sonra benzeri çağrılabilecek bir işlevi dışa aktarıyorsunuz require('./app/routes')(app, passport).


Benzer bir hatanın ortaya çıkmasının bir başka nedeni de, modül A'nın yapmaya çalıştığı require(B)ve modül B'nin yapmaya çalıştığı dairesel bir modül bağımlılığınız varsa olabilir require(A). Bu olduğunda, require()alt sistem tarafından algılanacak ve bunlardan biri geri dönecek nullve böylece onu bir işlev olarak çağırmaya çalışmak çalışmayacaktır. Bu durumda düzeltme, genellikle ortak kodu üçüncü bir modüle bölerek döngüsel bağımlılığı ortadan kaldırmaktır.


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

@Magne - Ama OP, require('./app/routes')(app, passport);sizin dışa aktardığınız şekilde çalışmayacak olan yapmaya çalışıyor .
jfriend00

Doğru, benim hatam. Kullanım durumum biraz farklıydı. Adlandırılmış bir işlevi dışa aktarmak istedim.
Magne

67

Benim için, Hemen çağrılan işlevi yaptığımda ;, sonuna koymam gerekiyor require().

Hata:

const fs = require('fs')

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

İyi:

const fs = require('fs');

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

7
Bu benim de sorunumdu! Sorun şu ki, çalışma zamanı bu durumda beyaz boşluğu yok sayıyor ve bu nedenle işlev bedeninizi () => {}, döndürülen şeye bir argüman olarak iletiyorsunuz gibi görünüyor require( ... ). Korkunç!
Will Brickner

evet, bu 'JS'de noktalı virgül' tartışmasında noktalı virgül lehine iyi bir argümandır. Neyse ki, noktalı virgüllerin yokluğu yalnızca modası geçmekte olan IIFE'ler bağlamında sorun gibi görünüyor
JP Lew

1
Aman Tanrım!! Ben geldim puppeteerve burada bir sorun bulana kadar neredeyse oradan bir sorun talep ettim. Phew ... bunun ;beni bu kadar rahatsız edeceğini hiç düşünmemiştim .
Irfandy Jip

1
Harika çözüm! Kendini çağıran her işlevin önüne aslında noktalı virgül koymanız gerektiğini unutmayın. Bu yapıyı uyarladım:;(() => {})()
Dmitry

Kod bir kitaplık içindeyse seçenekler nelerdir? Noktalı virgül kullanmayan bir node_modules kitaplığım (node-mailjet) var. Yerel olarak Webpack ile inşa edebilirim, ancak Docker'ı geliştirdiğimde şu hatayı alıyorum :(
Javier Guzmán


0

Benim için, dallar arasında geçiş yaptığımda benzer bir hata aldım - @google-cloud/datastoredışa aktarılan nesnenin özelliklerinden biri olarak Datastore yapıcısı ile nesne döndüren paketlerin daha yeni ("typcriptish") sürümü kullanıldı ve bir görev için başka bir şubeye, daha eski bir veri deposu sürümüne geçtim Datastore yapıcısını "doğrudan" module.exportsdeğer olarak dışa aktaran orada kullanıldı . Hatayı aldım çünkü node_modules, geçtiğim dal tarafından kullanılan daha yeni modüllere sahip.


0

Ben de böyle bir şeyle karşılaştım. Rota dosyanızda, işlevi aşağıdaki gibi bir nesne olarak dışa aktarın:

 module.exports = {
     hbd: handlebar
 }

ve uygulama dosyanızda, .hbd ile işleve erişebilirsiniz ve ptoblem yoktur ....!


-1

Lütfen dışarı aktarmak unutmayın routes.js.

İçine routes.jsrotalarınızı ve tüm kodunuzu bu işlev modülüne yazın:

exports = function(app, passport) {

/* write here your code */ 

}

-1

Dosyaları istediğiniz yerde Ok işlevini kaydırmanız yeterli


5
Bize söylediklerinizi nasıl yapacağınıza dair bir kod gösterirseniz iyi olur
U11-İleri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.