Circular Dependencies in Node - How to fix!

Nội dung bài viết

Video học lập trình mỗi ngày

Is not a function nodejs. Vào một ngày đẹp trời bạn mở lên code và nhận thông báo đó, những file mà bạnrequire trước đó tự nhiên biến thành empty {}. Và đó chính là một lỗi mà có lẽ ai cũng nên gặp phải để mà biết còn fix đó là WARNING in circular dependency.

Circular Dependencies Nodejs

Một số lỗi thuộc loại bí ẩn và lỗi myFunction Is not a function là một trong những lỗi bí ẩn đó. Lần đầu tiên tôi gặp lỗi vậy và tôi đã mất một vài giờ. Và cuối cùng tôi cũng đã tìm ra đó chính là lỗi Modules Cycles trong Nodejs đã có nói đến, vậy cụ thể ở đây là gì? Có nghĩa là ta có các modules như sau Module A, Module B. Và chúng ta sử dụng A call to B, B call to A. Và đôi khi bạn sửa đi sửa lại và xuất hiện lỗi : RangeError: Maximum call stack size exceeded

Nó gọi vòng tròn chính vì vậy xảy ra một số lỗi, và xem tình huống dưới đây để thẩy lỗi bí ẩn.

Tôi có 2 modules a.jsb.js như sau:

File: a.js

var b = require('./b'); //import file b.js

module.exports = {
    getThisName : function() {
        return b.getOtherModuleName();
    },
    getOtherModuleName : function() {
        return b.getThisName();
    },
    name : () => {
        return "moduleA"
    }
}

File: b.js

var a = require('./a');

module.exports = {
    getThisName : function() {
        return "moduleB";
    },
    getOtherModuleName : function() {
        return a.name();
    }
}

Và để test thì tôi tạo thêm một file có tên là main.js

var a = require('./a');

console.log('getOtherModuleName:::', a.getOtherModuleName());
console.log('getThisName:::', a.getThisName());

Các bạn đoán xem, Ouput ra là gì?

unit-test/testModule/b.js:8

return a.name();
TypeError: a.name is not a function

Vâng nó chính là lỗi này mà tôi đã mệt mỏi tìm nó mất 1 giờ đồng hồ: is not a function. Bạn có thể tìm thêm về lỗi này trên Google hay tại trang chủ Node.js

How to fix Circular Dependencies

Sau khi phát hiện ra điều đó, tôi đã có phương án thay thế file a.js như sau:

var b = require('./b');

const getThisName = () => {
    return b.getOtherModuleName()
}
const getOtherModuleName = () => {
    return b.getThisName();
}

const getName = () => {
    return 'moduleA is OK'
}

exports.getThisName = getThisName;
exports.getOtherModuleName = getOtherModuleName;
exports.name = getName;

Và kết quả thu được rất chi là ok:

$ node testModule/main.js 
getOtherModuleName::: moduleB
getThisName::: moduleA is OK

Các bạn backend nên cẩn thận lỗi Circular Dependencies Nodejs này. Một bài viết rất chi là cụ thể và thực tế. Chúc các bạn may mắn, không gặp nhiều lỗi bí ẩn như tôi.

Có thể bạn đã bị missing