doc: update js-native-api example

Update example that shows how to separate N-API code which is not
Node.js-specific from code which defines a Node.js N-API addon. In its
existing state the example uses the pattern

```C
assert(napi_*() == napi_ok);
```

However, this would result in no N-API calls when building with
`-DNDEBUG`.

This change moves away from assert and uses a macro `NAPI_CALL()` which
throws the string corresponding to the non-`napi_ok` status as a JS
exception and short-circuits the binding by returning `NULL`.

PR-URL: https://github.com/nodejs/node/pull/28657
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
Gabriel Schulhof 2019-07-12 09:50:48 -07:00 committed by Rich Trott
parent ef579110cd
commit 8cb4ba982b

View File

@ -192,20 +192,48 @@ napi_value create_addon(napi_env env);
```C ```C
// addon.c // addon.c
#include "addon.h" #include "addon.h"
#define NAPI_CALL(env, call) \
do { \
napi_status status = (call); \
if (status != napi_ok) { \
const napi_extended_error_info* error_info = NULL; \
napi_get_last_error_info((env), &error_info); \
bool is_pending; \
napi_is_exception_pending((env), &is_pending); \
if (!is_pending) { \
const char* message = (error_info->error_message == NULL) \
? "empty error message" \
: error_info->error_message; \
napi_throw_error((env), NULL, message); \
return NULL; \
} \
} \
} while(0)
static napi_value
DoSomethingUseful(napi_env env, napi_callback_info info) {
// Do something useful.
return NULL;
}
napi_value create_addon(napi_env env) { napi_value create_addon(napi_env env) {
napi_value result; napi_value result;
assert(napi_create_object(env, &result) == napi_ok); NAPI_CALL(env, napi_create_object(env, &result));
napi_value exported_function; napi_value exported_function;
assert(napi_create_function(env, NAPI_CALL(env, napi_create_function(env,
"doSomethingUseful", "doSomethingUseful",
NAPI_AUTO_LENGTH, NAPI_AUTO_LENGTH,
DoSomethingUseful, DoSomethingUseful,
NULL, NULL,
&exported_function) == napi_ok); &exported_function));
assert(napi_set_named_property(env,
result, NAPI_CALL(env, napi_set_named_property(env,
"doSomethingUseful", result,
exported_function) == napi_ok); "doSomethingUseful",
exported_function));
return result; return result;
} }
``` ```
@ -213,12 +241,14 @@ napi_value create_addon(napi_env env) {
```C ```C
// addon_node.c // addon_node.c
#include <node_api.h> #include <node_api.h>
#include "addon.h"
static napi_value Init(napi_env env, napi_value exports) { NAPI_MODULE_INIT() {
// This function body is expected to return a `napi_value`.
// The variables `napi_env env` and `napi_value exports` may be used within
// the body, as they are provided by the definition of `NAPI_MODULE_INIT()`.
return create_addon(env); return create_addon(env);
} }
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
``` ```
## Basic N-API Data Types ## Basic N-API Data Types