NodeJs: TypeError: request (…) không phải là một hàm


86

Tôi đang cố gắng yêu cầu một tệp và sau đó chuyển nó đến một var. Tôi đang làm theo hướng dẫn này để tạo hệ thống xác thực. Sau khi ghi tệp server.js và cố gắng biên dịch, tôi gặp lỗi bson, do đó tôi đã thay đổi dòng yêu cầu phiên bản phát hành của nó trong mongoose.

Đây là mã và lỗi của tôi:

server.js

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

lỗi

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

Tôi đã đọc rằng điều này thường có nghĩa là requestJS không được tải đúng cách nhưng tôi không biết tại sao hoặc cách khắc phục nó.

Chỉnh sửa do nhận xét:

Như đã hỏi, đây là kết quả củaconsole.log(require);


Bạn có thể console.log(require)trước khi dòng không thành công? Bạn không nên cần requestJS ở phía máy chủ, node.js đã tích hợp sẵn một hệ thống mô-đun (CommonJS, cũng sử dụng requirechức năng). Một cái gì đó dường như đang thay đổi requirebiến toàn cục.
kraf

Câu trả lời:


107

Tôi nghĩ rằng điều này có nghĩa là module.exportstrong ./app/routesmô-đun của bạn không được gán cho một hàm nên do đó require('./app/routes')không phân giải thành một hàm, do đó, bạn không thể gọi nó như một hàm như thế này require('./app/routes')(app, passport).

Cho chúng tôi ./app/routesxem nếu bạn muốn chúng tôi bình luận thêm về điều đó.

Nó sẽ trông giống như thế này;

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

Bạn đang xuất một hàm sau đó có thể được gọi là như thế require('./app/routes')(app, passport).


Một lý do khác khiến lỗi tương tự có thể xảy ra là nếu bạn có phần phụ thuộc mô-đun tròn trong đó mô-đun A đang cố gắng require(B)và mô-đun B đang cố gắng require(A). Khi điều này xảy ra, nó sẽ được phát hiện bởi require()hệ thống con và một trong số chúng sẽ quay lại nullvà do đó cố gắng gọi đó là một hàm sẽ không hoạt động. Cách khắc phục trong trường hợp đó là loại bỏ sự phụ thuộc vòng tròn, thường bằng cách phá vỡ mã chung thành một mô-đun thứ ba mà cả hai đều có thể tải riêng mặc dù các chi tiết cụ thể của việc sửa sự phụ thuộc vòng tròn là duy nhất cho từng tình huống.


Hoặc:module.exports.functionName = function functionName(app, passport) { ... }
Magne

@Magne - Nhưng OP đang cố gắng làm điều require('./app/routes')(app, passport);này sẽ không hoạt động theo cách bạn hiển thị xuất.
jfriend00

Đúng, tệ của tôi. Trường hợp sử dụng của tôi hơi khác. Tôi muốn xuất một hàm được đặt tên.
Magne

61

Đối với tôi, khi tôi thực hiện hàm được gọi ngay lập tức, tôi cần đặt ;ở cuối require().

Lỗi:

const fs = require('fs')

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

Tốt:

const fs = require('fs');

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

7
Đây cũng là vấn đề của tôi! Vấn đề thực sự là thời gian chạy bỏ qua khoảng trắng trong trường hợp này, và do đó, có vẻ như bạn đang chuyển phần thân hàm của mình () => {}làm đối số cho bất kỳ thứ gì được trả về require( ... ). Khủng khiếp!
Will Brickner

vâng, đây là một lập luận tốt ủng hộ các dấu chấm phẩy trong cuộc tranh luận 'dấu chấm phẩy trong JS'. May mắn thay, sự vắng mặt của dấu chấm phẩy dường như chỉ là vấn đề trong bối cảnh của IIFEs, vốn đang lỗi thời
JP Lew

1
Ôi chúa ơi!! Tôi đã đến puppeteervà gần như yêu cầu một vấn đề ở đó cho đến khi tôi tìm thấy một vấn đề ở đây. Phù ... không bao giờ nghĩ rằng điều đó ;sẽ làm phiền tôi nhiều như vậy.
Irfandy Jip

1
Giải pháp tuyệt vời! Lưu ý rằng bạn thực sự nên đặt dấu chấm phẩy trước mỗi hàm tự gọi. Tôi đã điều chỉnh cấu trúc này:;(() => {})()
Dmitry

Các tùy chọn nếu mã nằm trong thư viện là gì? Tôi có một thư viện node_modules (node-mailjet) hoàn toàn không sử dụng dấu chấm phẩy. Tôi có thể xây dựng với Webpack ok cục bộ nhưng khi tôi xây dựng trên Docker thì nó gặp lỗi này :(
Javier Guzmán


0

Đối với tôi, tôi gặp lỗi tương tự khi chuyển đổi giữa các nhánh - một phiên bản @google-cloud/datastoregói mới hơn ("kiểu mô tả") được sử dụng trả về đối tượng có hàm tạo Kho dữ liệu là một trong các thuộc tính của đối tượng được xuất và tôi đã chuyển sang nhánh khác cho một tác vụ, phiên bản kho dữ liệu cũ hơn đã được sử dụng ở đó, xuất khẩu phương thức khởi tạo Kho dữ liệu "trực tiếp" dưới dạng module.exportsgiá trị. Tôi gặp lỗi vì node_modules vẫn có các mô-đun mới hơn được sử dụng bởi chi nhánh mà tôi đã chuyển từ đó sang.


0

Tôi cũng đã phải đối mặt với một thứ như thế này. trong tệp định tuyến của bạn, hãy xuất hàm dưới dạng một đối tượng như sau:

 module.exports = {
     hbd: handlebar
 }

và trong tệp ứng dụng của bạn, bạn có thể có quyền truy cập vào chức năng bằng .hbd và không có vấn đề gì ....!


-1

Hãy nhớ xuất của bạn routes.js.

Trong routes.js, viết các tuyến và tất cả mã của bạn trong mô-đun chức năng này:

exports = function(app, passport) {

/* write here your code */ 

}

-1

Chỉ cần bọc trong hàm Mũi tên nơi bạn yêu cầu tệp


5
Rất vui nếu bạn cho chúng tôi xem một số mã về cách thực hiện những gì bạn đã nói
U10-Forward
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.