Skip to content

Commit 199f871

Browse files
committed
Improved error messages for module loading failures.
There are several reasons why a file cannot be opened. Without extra information, especially in containerized environments, these problems are difficult to debug. Adding errno status to the error output helps identify the root cause. Additionally, error messages are now aligned between njs and QuickJS.
1 parent 1b2a339 commit 199f871

File tree

6 files changed

+26
-10
lines changed

6 files changed

+26
-10
lines changed

nginx/ngx_js.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1979,10 +1979,15 @@ ngx_qjs_module_loader(JSContext *cx, const char *module_name, void *opaque)
19791979
info.name.start = (u_char *) module_name;
19801980
info.name.length = njs_strlen(module_name);
19811981

1982+
errno = 0;
19821983
ret = ngx_js_module_lookup(conf, &info);
19831984
if (ret != NJS_OK) {
1984-
JS_ThrowReferenceError(cx, "could not load module filename '%s'",
1985-
module_name);
1985+
if (errno != 0) {
1986+
JS_ThrowReferenceError(cx, "Cannot load module \"%s\" "
1987+
"(%s:%s)", module_name,
1988+
njs_errno_string(errno), strerror(errno));
1989+
}
1990+
19861991
return NULL;
19871992
}
19881993

@@ -3764,8 +3769,14 @@ ngx_js_module_loader(njs_vm_t *vm, njs_external_ptr_t external, njs_str_t *name)
37643769

37653770
info.name = *name;
37663771

3772+
errno = 0;
37673773
ret = ngx_js_module_lookup(conf, &info);
37683774
if (njs_slow_path(ret != NJS_OK)) {
3775+
if (errno != 0) {
3776+
njs_vm_ref_error(vm, "Cannot load module \"%V\" (%s:%s)", name,
3777+
njs_errno_string(errno), strerror(errno));
3778+
}
3779+
37693780
return NULL;
37703781
}
37713782

src/njs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ extern const njs_value_t njs_value_undefined;
7272
njs_vm_error2(vm, 2, fmt, ##__VA_ARGS__)
7373
#define njs_vm_range_error(vm, fmt, ...) \
7474
njs_vm_error2(vm, 3, fmt, ##__VA_ARGS__)
75+
#define njs_vm_ref_error(vm, fmt, ...) \
76+
njs_vm_error2(vm, 4, fmt, ##__VA_ARGS__)
7577
#define njs_vm_syntax_error(vm, fmt, ...) \
7678
njs_vm_error2(vm, 5, fmt, ##__VA_ARGS__)
7779
#define njs_vm_type_error(vm, fmt, ...) \

src/njs_module.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ njs_module_require(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
148148

149149
module = njs_module_find(vm, &name, 0);
150150
if (njs_slow_path(module == NULL)) {
151-
njs_error(vm, "Cannot find module \"%V\"", &name);
151+
njs_error(vm, "Cannot load module \"%V\"", &name);
152152

153153
return NJS_ERROR;
154154
}

src/njs_parser.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8114,7 +8114,7 @@ njs_parser_module(njs_parser_t *parser, njs_str_t *name)
81148114
vm = parser->vm;
81158115

81168116
if (name->length == 0) {
8117-
njs_parser_syntax_error(parser, "Cannot find module \"%V\"", name);
8117+
njs_parser_ref_error(parser, "Cannot load module \"%V\"", name);
81188118
return NULL;
81198119
}
81208120

@@ -8124,13 +8124,16 @@ njs_parser_module(njs_parser_t *parser, njs_str_t *name)
81248124
}
81258125

81268126
if (vm->module_loader == NULL) {
8127-
njs_parser_syntax_error(parser, "Cannot load module \"%V\"", name);
8127+
njs_parser_ref_error(parser, "Module loader callback is not provided");
81288128
return NULL;
81298129
}
81308130

81318131
module = vm->module_loader(vm, vm->module_loader_opaque, name);
81328132
if (module == NULL) {
8133-
njs_parser_syntax_error(parser, "Cannot find module \"%V\"", name);
8133+
if (!njs_is_valid(&vm->exception)) {
8134+
njs_parser_ref_error(parser, "Cannot load module \"%V\"", name);
8135+
}
8136+
81348137
return NULL;
81358138
}
81368139

src/test/njs_unit_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18975,7 +18975,7 @@ static njs_unit_test_t njs_test[] =
1897518975
/* require(). */
1897618976

1897718977
{ njs_str("require('unknown_module')"),
18978-
njs_str("Error: Cannot find module \"unknown_module\"") },
18978+
njs_str("Error: Cannot load module \"unknown_module\"") },
1897918979

1898018980
{ njs_str("require()"),
1898118981
njs_str("TypeError: missing path") },
@@ -19045,7 +19045,7 @@ static njs_unit_test_t njs_test[] =
1904519045
njs_str("SyntaxError: Unexpected token \"{\" in 1") },
1904619046

1904719047
{ njs_str("import x from ''"),
19048-
njs_str("SyntaxError: Cannot find module \"\" in 1") },
19048+
njs_str("ReferenceError: Cannot load module \"\" in 1") },
1904919049

1905019050
{ njs_str("export"),
1905119051
njs_str("SyntaxError: Illegal export statement in 1") },

test/shell_test_njs.exp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,13 @@ njs_test {
173173
# quiet mode
174174

175175
njs_run {"-q" "test/js/import_chain.t.js"} \
176-
"SyntaxError: Cannot find module \"lib2.js\" in 7"
176+
"ReferenceError: Cannot load module \"lib2.js\" in 7"
177177

178178
# sandboxing
179179

180180
njs_test {
181181
{"var fs = require('fs')\r\n"
182-
"Error: Cannot find module \"fs\"\r\n"}
182+
"Error: Cannot load module \"fs\"\r\n"}
183183
} "-s"
184184

185185
njs_test {

0 commit comments

Comments
 (0)